class Hinge::Resolver

Constants

CircularReference
Error
UnknownDependency

Attributes

container[R]
resolved[R]

Public Class Methods

new(container) click to toggle source
# File lib/hinge/resolver.rb, line 7
def initialize(container)
  @container = container
  @nodes = {}
  @resolved = {}
end

Public Instance Methods

resolve(name) click to toggle source
# File lib/hinge/resolver.rb, line 15
def resolve(name)
  return resolved[name] if resolved.key?(name)

  raise ArgumentError unless name.is_a?(Symbol)

  node = node(name)
  populate_node(node)

  resolved[name]
end

Private Instance Methods

complain(exn, node, history, msg = "") click to toggle source
# File lib/hinge/resolver.rb, line 47
def complain(exn, node, history, msg = "")
  raise exn, "#{msg} (resolving #{[*history, node.name].join(" -> ")})"
end
node(name) click to toggle source
# File lib/hinge/resolver.rb, line 51
def node(name)
  @nodes[name] ||= Node.new(name, container)
end
populate_node(node, history = []) click to toggle source
# File lib/hinge/resolver.rb, line 28
def populate_node(node, history = [])
  unless node.method
    complain(UnknownDependency, node, history, "method #{node.method_name} not found")
  end
  if history.include?(node.name)
    complain(CircularReference, node, history, "dependency #{node.name} depends on itself")
  end

  node.dependency_names.each do |dep_name|
    populate_node node(dep_name), history + [node.name] unless @resolved[dep_name]
  end

  ordered_dependent_values =
    node.dependency_names.map do |dep_name|
      @resolved[dep_name]
    end
  @resolved[node.name] = node.invoke(ordered_dependent_values)
end