Class: WrapperBased::Roles

Inherits:
Module
  • Object
show all
Defined in:
lib/wrapper_based/roles.rb

Defined Under Namespace

Modules: InstanceMethods

Constant Summary collapse

Unassigned =
Class.new(StandardError)

Instance Method Summary collapse

Constructor Details

#initialize(wrappers, *roles, **where, &block) ⇒ Roles

Returns a new instance of Roles.



5
6
7
8
9
10
11
# File 'lib/wrapper_based/roles.rb', line 5

def initialize(wrappers, *roles, **where, &block)
  @casting_agent = (where.keys | roles.map(&:to_sym)).inject {|cast, role| cast[role] = Casting.new(role, wrappers) }
  @casting_agent.keys.each { |role| add_role role }
  where.each_pair {|role, trait| @casting[role].as trait }
  define_casting_director(@casting_agent)
  include InstanceMethods
end

Instance Method Details

#add_reader_for(role) ⇒ Object



30
31
32
33
34
# File 'lib/wrapper_based/roles.rb', line 30

def add_reader_for(role)
  define_method(role) do
    _casting_director_.fetch(role) { raise Roles::Unassigned, "Role '#{role}' is missing.", caller }
  end
end

#add_role(role) ⇒ Object



25
26
27
28
# File 'lib/wrapper_based/roles.rb', line 25

def add_role(role)
  add_reader_for(role)
  add_writer_for(role)
end

#add_role_to_class(role, casting) ⇒ Object



44
45
46
# File 'lib/wrapper_based/roles.rb', line 44

def add_role_to_class(role, casting)
  define_singleton_method(role) { casting }
end

#add_writer_for(role) ⇒ Object



36
37
38
39
40
41
42
# File 'lib/wrapper_based/roles.rb', line 36

def add_writer_for(role)
  role_player = :"@#{role}"
  define_method(:"#{role}=") do |actor|
    instance_variable_set(role_player, actor)
    _casting_director_.cast_as role, actor
  end
end

#cast_as(role, actor) ⇒ Object



13
14
15
# File 'lib/wrapper_based/roles.rb', line 13

def cast_as role, actor

end

#define_casting_directorObject



48
49
50
# File 'lib/wrapper_based/roles.rb', line 48

def define_casting_director
  roles = self
end

#defing_casting_director(casting_agent) ⇒ Object



17
18
19
# File 'lib/wrapper_based/roles.rb', line 17

def defing_casting_director(casting_agent)
  define_method(:_casting_director_) { @_casting_director ||= CastingDirector.new(casting_agent) }
end

#included(base) ⇒ Object



52
53
54
# File 'lib/wrapper_based/roles.rb', line 52

def included(base)
  base.extend ClassMethods
end