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