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