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