class DependencyInjection::Definition
Attributes
arguments[RW]
configurator[RW]
file_path[RW]
klass_name[RW]
method_calls[RW]
scope[RW]
Public Class Methods
new(klass_name, container)
click to toggle source
# File lib/dependency_injection/definition.rb, line 8 def initialize(klass_name, container) @container = container self.arguments = [] self.file_path = nil self.klass_name = klass_name self.method_calls = {} self.scope = :container end
Public Instance Methods
add_argument(argument)
click to toggle source
# File lib/dependency_injection/definition.rb, line 17 def add_argument(argument) self.add_arguments(argument) end
add_arguments(*arguments)
click to toggle source
# File lib/dependency_injection/definition.rb, line 21 def add_arguments(*arguments) self.arguments += arguments self end
add_configurator(name, method_name)
click to toggle source
# File lib/dependency_injection/definition.rb, line 27 def add_configurator(name, method_name) self.configurator = [name, method_name] self end
add_method_call(method_name, *arguments)
click to toggle source
# File lib/dependency_injection/definition.rb, line 33 def add_method_call(method_name, *arguments) self.method_calls[method_name] = arguments self end
klass()
click to toggle source
# File lib/dependency_injection/definition.rb, line 39 def klass self.klass_name.constantize end
object()
click to toggle source
# File lib/dependency_injection/definition.rb, line 43 def object self.send("#{self.scope}_scoped_object") end
Private Instance Methods
container_scoped_object()
click to toggle source
# File lib/dependency_injection/definition.rb, line 49 def container_scoped_object @object ||= initialize_object end
initialize_object()
click to toggle source
# File lib/dependency_injection/definition.rb, line 53 def initialize_object require_object object = self.klass.new(*resolve(self.arguments)) self.method_calls.each { |method_name, arguments| object.send(method_name, *resolve(arguments)) } if self.configurator name, method_name = self.configurator configurator_object = resolve([name]).first configurator_object.send(method_name, object) end object end
object_already_required?()
click to toggle source
# File lib/dependency_injection/definition.rb, line 66 def object_already_required? true if Kernel.const_get(self.klass_name) rescue false end
prototype_scoped_object()
click to toggle source
# File lib/dependency_injection/definition.rb, line 72 def prototype_scoped_object initialize_object end
require_object()
click to toggle source
# File lib/dependency_injection/definition.rb, line 76 def require_object return if object_already_required? if self.file_path require self.file_path else require self.klass_name.underscore end end
resolve(arguments)
click to toggle source
# File lib/dependency_injection/definition.rb, line 86 def resolve(arguments) resolve_references(resolve_container_parameters(arguments)) end
resolve_container_parameters(argument)
click to toggle source
# File lib/dependency_injection/definition.rb, line 90 def resolve_container_parameters(argument) if argument.kind_of?(Array) argument.map { |arg| resolve(arg) } elsif /^%(?<parameter_name>.*)%$/ =~ argument.to_s @container.parameters[parameter_name] else argument end end
resolve_references(argument)
click to toggle source
# File lib/dependency_injection/definition.rb, line 100 def resolve_references(argument) if argument.kind_of?(Array) argument.map { |arg| resolve(arg) } elsif /^@(?<reference_name>.*)/ =~ argument.to_s reference_definition = @container.find(reference_name) reference = reference_definition.object raise ScopeWideningInjectionError if reference_definition.scope == :prototype && scope == :container reference else argument end end