Sha256: 4db720dd502095ca0e6f67ed90fb0a93eb18bcba230b8b5453901e919697237c

Contents?: true

Size: 1.37 KB

Versions: 2

Compression:

Stored size: 1.37 KB

Contents

# frozen_string_literal: true

require 'nina/builder/initialization'
require 'nina/builder/callbacks'

module Nina
  # Generates module that adds support for objects creation
  class Assembler
    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, delegate: false)
      build_order.each.with_index(-1).inject(nil) do |prev, (name, idx)|
        object = create_object(name, initialization)
        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.create(name) if initialization.to_h[name].nil?

      args, kwargs, block = initialization.to_h[name]
      @abstract_factory.create(name, *args, **kwargs, &block)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
nina-0.1.6 lib/nina/assembler.rb
nina-0.1.5 lib/nina/assembler.rb