class Corindon::DependencyInjection::Container

Attributes

definitions[R]

@return [Hash{String=>Definition}]

injector[R]
parameters[R]

@return [ParameterBag]

service_built_listeners[R]
services[R]
tags[R]

Public Class Methods

new(definitions: [], parameters: ParameterBag.new, service_built_listeners: []) click to toggle source

@param [Array<Definition>] definitions @param [ParameterBag] parameters

# File lib/corindon/dependency_injection/container.rb, line 12
def initialize(definitions: [], parameters: ParameterBag.new, service_built_listeners: [])
  @services = {}
  @definitions = {}
  @parameters = parameters
  @tags = Hash.new { |hash, key| hash[key] = [] }

  @injector = Injector.new(container: self)

  definitions.each { |d| register_definition(d) }

  @service_built_listeners = service_built_listeners
end

Public Instance Methods

add_definition(def_or_injectable, context: {}, &block) click to toggle source

@param [Class, Injectable, Definition] def_or_injectable @return [String]

# File lib/corindon/dependency_injection/container.rb, line 50
def add_definition(def_or_injectable, context: {}, &block)
  definition = as_definition(def_or_injectable)

  if block.sth?
    definition = Dsl.from_definition(definition).exec(context: context, &block)
  end

  id = definition.id || to_id(def_or_injectable)

  register_definition(
    Definition.new(
      definition.object_source,
      id: id,
      args: definition.args,
      kwargs: definition.kwargs,
      calls: definition.calls,
      tags: definition.tags
    )
  )

  id
end
as_definition(def_or_injectable) click to toggle source

@param [Definition, Injectable, Class] @return [Definition]

# File lib/corindon/dependency_injection/container.rb, line 36
def as_definition(def_or_injectable)
  if def_or_injectable.is_a?(Definition)
    def_or_injectable
  elsif def_or_injectable.is_a?(Injectable)
    def_or_injectable.definition
  elsif def_or_injectable.is_a?(Class)
    Definition.new(def_or_injectable)
  else
    raise StandardError.new("Don't know how to build #{def_or_injectable}")
  end
end
clear() click to toggle source

Clears all the cache of services

# File lib/corindon/dependency_injection/container.rb, line 91
def clear
  @services = {}
end
dup() click to toggle source

@return [Container]

# File lib/corindon/dependency_injection/container.rb, line 26
def dup
  Container.new(
    definitions: definitions.values,
    parameters: ParameterBag.new(parameters.bag.dup),
    service_built_listeners: service_built_listeners
  )
end
get(key) click to toggle source

@param [Class, to_s] key @return [Object]

# File lib/corindon/dependency_injection/container.rb, line 97
def get(key)
  id = to_id(key)

  if has?(key)
    services.fetch(id) { build_service(id) }
  elsif injectable?(key)
    key.definition.build(injector)
  else
    raise StandardError.new("No service #{id}")
  end
end
has?(key) click to toggle source

@param [Class, to_s] key @return [Boolean]

# File lib/corindon/dependency_injection/container.rb, line 86
def has?(key)
  definitions.key?(to_id(key))
end
on_service_built(listener) click to toggle source

@param [Proc{Object, Container}] listener

# File lib/corindon/dependency_injection/container.rb, line 128
def on_service_built(listener)
  service_built_listeners << listener
end
parameter(key) click to toggle source

@param [Class, String, Token::ParameterToken] key @return [Object]

# File lib/corindon/dependency_injection/container.rb, line 123
def parameter(key)
  parameters.get(key)
end
parameter?(key) click to toggle source

@param [Class, String, Token::ParameterToken] key @return [Boolean]

# File lib/corindon/dependency_injection/container.rb, line 117
def parameter?(key)
  parameters.has?(key)
end
set_parameter(key, value) click to toggle source

@param [Class, String, Token::ParameterToken] key @param [Object] value

# File lib/corindon/dependency_injection/container.rb, line 111
def set_parameter(key, value)
  parameters.set(key, value)
end
tagged(tag) click to toggle source

@param [String] tag @return [Array<String>]

# File lib/corindon/dependency_injection/container.rb, line 75
def tagged(tag)
  if tags.key?(tag)

    tags.fetch(tag)
  else
    []
  end
end

Private Instance Methods

build_service(id) click to toggle source
# File lib/corindon/dependency_injection/container.rb, line 147
def build_service(id)
  service = injector.resolve(definitions.fetch(id)).tap do |svc|
    services[id] = svc
  end

  service_built_listeners.each do |listener|
    listener.call(service, self)
  end

  service
end
injectable?(object) click to toggle source
# File lib/corindon/dependency_injection/container.rb, line 159
def injectable?(object)
  object.is_a?(Injectable)
end
register_definition(definition) click to toggle source
# File lib/corindon/dependency_injection/container.rb, line 142
def register_definition(definition)
  definitions[definition.id] = definition
  definition.tags.each { |tag| tags[tag] << definition.id }
end
to_id(key) click to toggle source

@param [Injectable, Identifiable, Class, Definition, to_s] key @return [String]

# File lib/corindon/dependency_injection/container.rb, line 165
def to_id(key)
  if key.is_a?(Definition)
    key.id
  elsif injectable?(key)
    to_id(key.definition)
  elsif key.is_a?(Class)
    key.name
  else
    key.to_s
  end
end