Class: Fabrik::Resolver

Inherits:
Object
  • Object
show all
Defined in:
lib/fabrik/resolver.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(method_maps) ⇒ Resolver

Returns a new instance of Resolver.



7
8
9
10
# File 'lib/fabrik/resolver.rb', line 7

def initialize(method_maps)
  @method_maps = method_maps
  @conflicts   = {}
end

Instance Attribute Details

#conflictsObject (readonly)

Returns the value of attribute conflicts.



5
6
7
# File 'lib/fabrik/resolver.rb', line 5

def conflicts
  @conflicts
end

Instance Method Details

#conflict_method(name, m1, m2) ⇒ Object



20
21
22
23
24
25
26
27
28
29
# File 'lib/fabrik/resolver.rb', line 20

def conflict_method(name, m1, m2)
  resolver, @conflicts[name] = self, [m1, m2]
  own.send(:define_method, name) do
    m1, m2 = resolver.conflicts[name]
    raise ConflictingMethods.new(
      "#{m1.owner} and #{m2.owner} both provide methods named :#{name}"
    )
  end
  own.instance_method(name)
end

#ownObject



31
32
33
# File 'lib/fabrik/resolver.rb', line 31

def own
  @own ||= Module.new
end

#resolved_method_mapObject



12
13
14
15
16
17
18
# File 'lib/fabrik/resolver.rb', line 12

def resolved_method_map
  @method_maps.reduce({}) do |result, method_map|
    result.merge!(method_map) do |name, m1, m2|
      m1 == m2 ? m1 : conflict_method(name, m1, m2)
    end
  end
end