lib/nina/builder.rb in nina-0.1.1 vs lib/nina/builder.rb in nina-0.1.2
- old
+ new
@@ -1,50 +1,19 @@
# 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
# Generates module that adds support for objects creation
class Builder
- attr_reader :name, :abstract_factory, :def_block
- attr_accessor :callbacks
+ attr_reader :name, :abstract_factory, :def_block, :callbacks
- # A way to call methods from initalization proc on base_class
- class Initialization < BasicObject
- def initialize(list)
- @list = list
- @atts = {}
- end
-
- def method_missing(method, *args, **kwargs, &block)
- return super unless @list.include?(method)
-
- @atts[method] = [args, kwargs, block]
- end
-
- def respond_to_missing?(method, include_private = false)
- @list.include?(method) || super
- end
-
- def to_h
- @atts
- end
- end
-
- # Utility to get user defined callbacks
- class Callbacks < Initialization
- def method_missing(method, *args, **kwargs, &block)
- return super unless @list.include?(method)
-
- @atts[method] unless block
- @atts[method] ||= []
- @atts[method] << block
- end
- end
-
# Definaes support methods and variables for concrete builder
module ClassMethods
def build_order_list
@build_order_list ||= []
end
@@ -66,27 +35,29 @@
factories[__method__].subclass(&definition) if definition
end
end
end
- def copy
- self.class.new(name, abstract_factory: abstract_factory)
- end
-
- def with_callbacks(&block)
- yield c = Callbacks.new(abstract_factory.factories.keys) if block
-
- self.class.new(name, abstract_factory: abstract_factory).tap { _1.callbacks = c }
- end
-
- def initialize(name, abstract_factory: nil, &def_block)
+ def initialize(name, abstract_factory: nil, callbacks: nil, &def_block)
@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
+ end
+
+ def copy
+ self.class.new(name, abstract_factory: abstract_factory)
+ end
+
+ def with_callbacks(&block)
+ c = callbacks&.copy || Callbacks.new(abstract_factory.factories.keys)
+ yield c if block
+
+ self.class.new(name, abstract_factory: abstract_factory, callbacks: c)
end
def wrap(delegate: false, &block)
yield @initialization if block