class Objectable::Resolver

The main logic value proposition of this library. An instance of this class can act as a value-get and value-set arbiter for objects.

Constants

DEFAULT_SEPARATOR

Attributes

interface[R]
separator[R]

Public Class Methods

new(separator: DEFAULT_SEPARATOR) click to toggle source
# File lib/objectable/resolver.rb, line 20
def initialize(separator: DEFAULT_SEPARATOR)
  @interface = Interface.new
  @separator = separator.to_s

  freeze
end

Public Instance Methods

==(other) click to toggle source
# File lib/objectable/resolver.rb, line 35
def ==(other)
  eql?(other)
end
eql?(other) click to toggle source
# File lib/objectable/resolver.rb, line 39
def eql?(other)
  return false unless other.is_a?(self.class)

  separator == other.separator
end
get(object, expression) click to toggle source
# File lib/objectable/resolver.rb, line 27
def get(object, expression)
  traverse(object, key_path(expression))
end
set(object, expression, value) click to toggle source
# File lib/objectable/resolver.rb, line 31
def set(object, expression, value)
  build_up(object, key_path(expression), value)
end

Private Instance Methods

build_and_set(pointer, key) click to toggle source
# File lib/objectable/resolver.rb, line 83
def build_and_set(pointer, key)
  interface.get(interface.set(pointer, key, pointer.class.new), key)
end
build_up(object, through, value) click to toggle source
# File lib/objectable/resolver.rb, line 68
def build_up(object, through, value)
  object.tap do |o|
    pointer = o

    preceding_keys = through[0..-2]
    last_key       = through.last

    preceding_keys.each do |key|
      pointer = interface.get(pointer, key) || build_and_set(pointer, key)
    end

    interface.set(pointer, last_key, value)
  end
end
key_path(expression) click to toggle source
# File lib/objectable/resolver.rb, line 49
def key_path(expression)
  return expression        if expression.is_a?(Array)
  return Array(expression) if separator.empty?

  expression.to_s.split(separator)
end
traverse(object, through) click to toggle source
# File lib/objectable/resolver.rb, line 56
def traverse(object, through)
  pointer = object

  through.each do |key|
    next unless pointer

    pointer = interface.get(pointer, key)
  end

  pointer
end