lib/nina.rb in nina-0.1.6 vs lib/nina.rb in nina-0.2.0

- old
+ new

@@ -1,10 +1,8 @@ # frozen_string_literal: true require 'toritori' -require 'observer' -require 'nina/assembler' require 'nina/builder' require_relative 'nina/version' # Module that provides DSL for builders @@ -49,11 +47,11 @@ def self.included(receiver) receiver.extend ClassMethods end - def self.def_accessor(accessor, on:, to:, delegate: false) + def self.def_reader(accessor, on:, to:, delegate: false) on.define_singleton_method(accessor) { to } on.define_singleton_method(:predecessor) { to } def on.predecessors Enumerator.new do |y| obj = self @@ -63,13 +61,23 @@ return unless delegate on.extend(MethodMissingDelegation) end - def self.linked_list(build_config, delegate: false) - build_order = build_config.keys - build_config.each.with_index(-1).inject(nil) do |prev, ((_, object), idx)| - Nina.def_accessor(build_order[idx], on: object, to: prev, delegate: delegate) if prev + def self.link(build, delegate: false, &block) + result = nil + build.each.inject(nil) do |prev, (name, object)| + Nina.def_reader(name, on: prev, to: object, delegate: delegate) if prev + yield(name, object) if block + object.tap { |o| result ||= o } + end + result + end + + def self.reverse_link(build, delegate: false, &block) + build.each.with_index(-1).inject(nil) do |prev, ((name, object), idx)| + Nina.def_reader(build.keys[idx], on: object, to: prev, delegate: delegate) if prev + yield(name, object) if block object end end end