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