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