Module: Surrounded::Context::RoleBuilders

Defined in:
lib/surrounded/context/role_builders.rb

Instance Method Summary collapse

Instance Method Details

#delegate_class(name, class_name, &block) ⇒ Object

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.



41
42
43
44
45
46
47
# File 'lib/surrounded/context/role_builders.rb', line 41

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) ⇒ Object

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.



57
58
59
60
61
62
63
64
65
# File 'lib/surrounded/context/role_builders.rb', line 57

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) ⇒ Object Also known as: role_methods

Define behaviors for your role players



16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/surrounded/context/role_builders.rb', line 16

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

#wrap(name, &block) ⇒ Object Also known as: wrapper

Create a named behavior for a role using the standard library SimpleDelegator.



31
32
33
34
35
36
# File 'lib/surrounded/context/role_builders.rb', line 31

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