class Fabrik::Resolver

Attributes

conflicts[R]

Public Class Methods

new(method_maps) click to toggle source
# File lib/fabrik/resolver.rb, line 7
def initialize(method_maps)
  @method_maps = method_maps
  @conflicts   = {}
end

Public Instance Methods

conflict_method(name, m1, m2) click to toggle source
# 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
own() click to toggle source
# File lib/fabrik/resolver.rb, line 31
def own
  @own ||= Module.new
end
resolved_method_map() click to toggle source
# 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