class Fabrique::BeanFactory

Attributes

registry[R]
singletons[R]

Public Class Methods

new(registry) click to toggle source
# File lib/fabrique/bean_factory.rb, line 8
def initialize(registry)
  @registry = registry
  @registry.validate!
  @gem_loader = GemLoader.new(@registry.get_gem_definitions)
  @singletons = {}
  @semaphore = Mutex.new
end

Public Instance Methods

get_bean(bean_name) click to toggle source
# File lib/fabrique/bean_factory.rb, line 16
def get_bean(bean_name)
  @semaphore.synchronize do
    get_bean_unsynchronized(bean_name)
  end
end
load_gem_dependencies() click to toggle source
# File lib/fabrique/bean_factory.rb, line 22
def load_gem_dependencies
  @gem_loader.load_gems
end
to_h() click to toggle source
# File lib/fabrique/bean_factory.rb, line 26
def to_h
  @semaphore.synchronize do
    @registry.get_definitions.map { |defn| [defn.id, get_bean_unsynchronized(defn.id)] }.to_h
  end
end

Private Instance Methods

constructor_injection(defn) click to toggle source
# File lib/fabrique/bean_factory.rb, line 67
def constructor_injection(defn)
  args = resolve_bean_references(defn.constructor_args)
  factory = get_factory(defn)
  if args.respond_to?(:keys)
    bean = factory.send(defn.factory_method, args)
  else
    bean = factory.send(defn.factory_method, *args)
  end
end
get_bean_by_definition(defn) click to toggle source
# File lib/fabrique/bean_factory.rb, line 48
def get_bean_by_definition(defn)
  if defn.factory_method == "itself"
    return get_factory(defn)
  end

  bean = constructor_injection(defn)
  property_injection(bean, defn)
end
get_bean_unsynchronized(bean_name) click to toggle source
# File lib/fabrique/bean_factory.rb, line 34
def get_bean_unsynchronized(bean_name)
  defn = @registry.get_definition(bean_name)

  if defn.singleton? and singleton = @singletons[bean_name]
    return singleton
  end

  bean = get_bean_by_definition(defn)
  if defn.singleton?
    @singletons[bean_name] = bean
  end
  bean
end
get_factory(defn) click to toggle source
# File lib/fabrique/bean_factory.rb, line 57
def get_factory(defn)
  if defn.type.is_a?(BeanReference)
    get_bean_unsynchronized(defn.type.bean)
  elsif defn.type.is_a?(Module)
    defn.type
  else
    Module.const_get(defn.type)
  end
end
property_injection(bean, defn) click to toggle source
# File lib/fabrique/bean_factory.rb, line 77
def property_injection(bean, defn)
  defn.properties.each do |k, v|
    bean.send("#{k}=", resolve_bean_references(v))
  end
  bean
end
resolve_bean_references(data) click to toggle source
# File lib/fabrique/bean_factory.rb, line 84
def resolve_bean_references(data)
  if data.is_a?(Hash)
    data.inject({}) do |memo, (k, v)|
      memo[k] = resolve_bean_references(v)
      memo
    end
  elsif data.is_a?(Array)
    data.inject([]) do |acc, v|
      acc << resolve_bean_references(v)
    end
  elsif data.is_a?(BeanDefinition)
    get_bean_by_definition(data)
  elsif data.is_a?(BeanReference)
    get_bean_unsynchronized(data.bean)
  elsif data.is_a?(BeanPropertyReference)
    data.resolve(get_bean_unsynchronized(data.bean))
  else
    data
  end
end