lib/key_mapable/mapper.rb in key_mapable-0.5.0 vs lib/key_mapable/mapper.rb in key_mapable-0.6.0
- old
+ new
@@ -1,46 +1,53 @@
# frozen_string_literal: true
# Used internally by the KeyMapable concern.
class KeyMapable::Mapper
- attr_reader :subject, :structure
+ attr_reader :subject, :structure, :accessor
- def initialize(subject)
+ def initialize(subject, accessor = KeyMapable::Accessor::Method)
@subject = subject
@structure = {}
+ @accessor = accessor
end
def key_value(key)
- @structure[key] = yield()
+ @structure[key] = yield(subject)
end
def key(name, &block)
- child_mapper = self.class.new(subject)
+ child_mapper = self.class.new(subject, accessor)
child_mapper.instance_eval(&block)
@structure[name] = child_mapper.resolve
end
def key_map(original_key, new_key, transform: ->(val) { val }, &block)
- original_subject = subject.public_send(original_key)
+ original_subject = access(original_key)
transformed_subject = transform.call(original_subject)
if block_given?
- child_mapper = self.class.new(transformed_subject)
+ child_mapper = self.class.new(transformed_subject, accessor)
child_mapper.instance_eval &block
@structure[new_key] = child_mapper.resolve
else
@structure[new_key] = transformed_subject
end
end
def array_key_map(original_key, new_key, &block)
- original_subject = subject.public_send(original_key)
+ original_subject = access(original_key)
@structure[new_key] = original_subject.map do |item|
- child_mapper = self.class.new(item)
+ child_mapper = self.class.new(item, accessor)
child_mapper.instance_eval(&block)
child_mapper.resolve
end
end
def resolve
@structure
+ end
+
+ private
+
+ def access(key)
+ accessor.access(subject, key)
end
end