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