module Surrounded::Context::RoleBuilders
Public Class Methods
extended(base)
click to toggle source
# File lib/surrounded/context/role_builders.rb, line 7 def self.extended(base) Surrounded::Exceptions.define(base, exceptions: :InvalidRoleType) end
Public Instance Methods
delegate_class(name, class_name, &block)
click to toggle source
Create a named behavior for a role using the standard library DelegateClass. This ties the implementation of the role to a specific class or module API.
# File lib/surrounded/context/role_builders.rb, line 37 def delegate_class(name, class_name, &block) require 'delegate' wrapper_name = RoleName(name) klass = private_const_set(wrapper_name, DelegateClass(Object.const_get(class_name.to_s))) klass.class_eval(&block) klass.send(:include, Surrounded) end
interface(name, &block)
click to toggle source
Create an object which will bind methods to the role player.
This object will behave differently that a wrapper or delegate_class. The interface object should only be used for objects whose methods _will not_ call to the other objects in the context. Because the interface methods are applied individually to an object, that object is unaware of the other objects in the context and cannot access them from any of its methods.
# File lib/surrounded/context/role_builders.rb, line 53 def interface(name, &block) # AdminInterface interface_name = RoleName(name, 'Interface') behavior = private_const_set(interface_name, Module.new(&block)) require 'surrounded/context/negotiator' # Admin private_const_set(RoleName(name), Negotiator.for_role(behavior)) end
role(name, type=default_role_type, &block)
click to toggle source
Define behaviors for your role players
# File lib/surrounded/context/role_builders.rb, line 12 def role(name, type=default_role_type, &block) if type == :module mod_name = RoleName(name) mod = Module.new(&block).send(:include, ::Surrounded) private_const_set(mod_name, mod) else meth = method(type) meth.call(name, &block) end rescue NameError => e raise self::InvalidRoleType, e.message end
Also aliased as: role_methods
wrap(name, &block)
click to toggle source
Create a named behavior for a role using the standard library SimpleDelegator.
# File lib/surrounded/context/role_builders.rb, line 27 def wrap(name, &block) require 'delegate' wrapper_name = RoleName(name) klass = private_const_set(wrapper_name, Class.new(SimpleDelegator, &block)) klass.send(:include, Surrounded) end
Also aliased as: wrapper
Private Instance Methods
RoleName(text, suffix=nil)
click to toggle source
# File lib/surrounded/context/role_builders.rb, line 64 def RoleName(text, suffix=nil) RoleName.new(text, suffix) end