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

- old
+ new

@@ -1,10 +1,7 @@ # frozen_string_literal: true -require 'nina/builder/initialization' -require 'nina/builder/callbacks' - # This should be a kind of factory that creates complex objects # from simple ones. It should use torirori to create objects. # It also enriches objects with some methods that make them more # like linked lists. module Nina @@ -40,54 +37,54 @@ @name = name @def_block = def_block @abstract_factory = abstract_factory.include(Toritori).extend(ClassMethods) @abstract_factory.class_eval(&def_block) if def_block @abstract_factory.build_order_list.freeze - @initialization = Initialization.new(@abstract_factory.factories.keys) - @assembler = Assembler.new(@abstract_factory) - @callbacks = callbacks + @assembler = Assembler.new(@abstract_factory, callbacks) + @assembler.add_observer(self) + @observers = [] end + def add_observer(observer) + @observers << observer + end + def copy - self.class.new(name, abstract_factory: abstract_factory) + new_builder = self.class.new(name, abstract_factory: abstract_factory, callbacks: @assembler.callbacks) + @observers.each { |observer| new_builder.add_observer(observer) } + new_builder end def with_callbacks(&block) - c = callbacks&.copy || Callbacks.new(abstract_factory.factories.keys) - yield c if block + yield @assembler.callbacks if block - self.class.new(name, abstract_factory: abstract_factory, callbacks: c) + copy end def wrap(delegate: false, &block) - yield @initialization if block + yield @assembler.initialization if block - @assembler.inject( - @abstract_factory.build_order_list, - @initialization.to_h, - callbacks: callbacks.to_h, - delegate: delegate - ) + @assembler.inject(@abstract_factory.build_order_list, delegate: delegate) end def nest(delegate: false, &block) - yield @initialization if block + yield @assembler.initialization if block - @assembler.inject( - @abstract_factory.build_order_list.reverse, - @initialization.to_h, - callbacks: callbacks.to_h, - delegate: delegate - ) + @assembler.inject(@abstract_factory.build_order_list.reverse, delegate: delegate) end def subclass(&def_block) return unless def_block @abstract_factory = Class.new(abstract_factory) @abstract_factory.class_eval(&def_block) @abstract_factory.build_order_list.freeze - @initialization = Initialization.new(@abstract_factory.factories.keys) - @assembler = Assembler.new(@abstract_factory) + @assembler = Assembler.new(@abstract_factory, @assembler.callbacks) + end + + def update(name, object) + @observers.each do |observer| + observer.public_send(:"on_#{name}_created", object) if observer.respond_to?(:"on_#{name}_created") + end end end end