lib/nina/assembler.rb in nina-0.1.4 vs lib/nina/assembler.rb in nina-0.1.5

- old
+ new

@@ -1,28 +1,43 @@ # frozen_string_literal: true +require 'nina/builder/initialization' +require 'nina/builder/callbacks' + module Nina # Generates module that adds support for objects creation class Assembler - def initialize(abstract_factory) + include Observable + + attr_reader :initialization, :callbacks + + def initialize(abstract_factory, callbacks = nil) @abstract_factory = abstract_factory + @initialization = Builder::Initialization.new(@abstract_factory.build_order_list) + @callbacks = callbacks&.copy || Builder::Callbacks.new(@abstract_factory.build_order_list) end - def inject(build_order, initialization = {}, callbacks: nil, delegate: false) + def inject(build_order, delegate: false) build_order.each.with_index(-1).inject(nil) do |prev, (name, idx)| object = create_object(name, initialization) - Nina.def_accessor(build_order[idx], on: object, to: prev, delegate: delegate) if prev - callbacks[name].each { |c| c.call(object) } if callbacks&.key?(name) + setup_relation(object, prev, name, build_order[idx], delegate) + changed + notify_observers(name, object) object end end private + def setup_relation(object, prev, name, accessor, delegate) + Nina.def_accessor(accessor, on: object, to: prev, delegate: delegate) if prev + callbacks.to_h[name].each { |c| c.call(object) } if callbacks&.to_h&.key?(name) + end + def create_object(name, initialization = {}) - return @abstract_factory.factories[name].create if initialization[name].nil? + return @abstract_factory.create(name) if initialization.to_h[name].nil? - args, kwargs, block = initialization[name] - @abstract_factory.factories[name].create(*args, **kwargs, &block) + args, kwargs, block = initialization.to_h[name] + @abstract_factory.create(name, *args, **kwargs, &block) end end end