class TwoWayMapper::Node::Base

Constants

DIVIDER

Attributes

options[RW]
selector[RW]

Public Class Methods

new(selector, options = {}) click to toggle source
# File lib/two_way_mapper/node/base.rb, line 10
def initialize(selector, options = {})
  @selector, @options = selector, options
end

Public Instance Methods

keys(&block) click to toggle source
# File lib/two_way_mapper/node/base.rb, line 14
def keys(&block)
  unless block
    block = options[:stringify_keys] ? :to_s : :to_sym
    block = block.to_proc
  end
  selector.split(DIVIDER).map(&block)
end
read(source) click to toggle source
# File lib/two_way_mapper/node/base.rb, line 22
def read(source)
  rewind_forward(source) { |_obj, _key| return nil }
end
writable?(current_value, new_value) click to toggle source
# File lib/two_way_mapper/node/base.rb, line 30
def writable?(current_value, new_value)
  !options[:write_if] ||
    !options[:write_if].respond_to?(:call) ||
    options[:write_if].call(current_value, new_value)
end
write(_obj, _value) click to toggle source
# File lib/two_way_mapper/node/base.rb, line 26
def write(_obj, _value)
  raise NotImplementedError
end

Private Instance Methods

create_node(_obj, _key) click to toggle source
# File lib/two_way_mapper/node/base.rb, line 55
def create_node(_obj, _key)
  raise NotImplementedError
end
next_key(_obj, _key) click to toggle source
# File lib/two_way_mapper/node/base.rb, line 59
def next_key(_obj, _key)
  raise NotImplementedError
end
rewind_forward(obj, margin = 0) { |obj, key| ... } click to toggle source
# File lib/two_way_mapper/node/base.rb, line 38
def rewind_forward(obj, margin = 0)
  to = -(1 + margin.to_i.abs)

  keys[0..to].each do |key|
    unless rewind_to?(obj, key)
      block_given? ? yield(obj, key) : create_node(obj, key)
    end
    obj = next_key(obj, key)
  end

  obj
end
rewind_to?(_obj, _key) click to toggle source
# File lib/two_way_mapper/node/base.rb, line 51
def rewind_to?(_obj, _key)
  raise NotImplementedError
end