lib/config_mapper.rb in config_mapper-0.2.0 vs lib/config_mapper.rb in config_mapper-1.0.0

- old
+ new

@@ -1,9 +1,11 @@ +require "config_mapper/attribute_sink" + # Supports marshalling of plain-old data (e.g. loaded from # YAML files) onto strongly-typed objects. # -class ConfigMapper +module ConfigMapper # Attempt to set attributes on a target object. # # For simple, scalar values, set the attribute by calling the # named writer-method on the target object. @@ -11,87 +13,11 @@ # For Hash values, set attributes of the named sub-component. # # @return [Hash] exceptions encountered # def self.set(data, target) - mapper = new(target) + mapper = AttributeSink.new(target) mapper.set_attributes(data) mapper.errors - end - - def initialize(target, errors = {}) - @target = ObjectAsHash[target] - @errors = errors - end - - attr_reader :target - attr_reader :errors - - # Set multiple attributes from a Hash. - # - def set_attributes(data) - data.each do |key, value| - set_attribute(key, value) - end - end - - private - - # Set a single attribute. - # - def set_attribute(key, value) - if value.is_a?(Hash) && !target[key].nil? - nested_errors = ErrorProxy.new(errors, "#{key}.") - nested_mapper = self.class.new(target[key], nested_errors) - nested_mapper.set_attributes(value) - else - target[key] = value - end - rescue NoMethodError, ArgumentError => e - errors[key] = e - end - - class ObjectAsHash - - def self.[](target) - if target.is_a?(Hash) - target - else - ObjectAsHash.new(target) - end - end - - def initialize(target) - @target = target - end - - def [](key) - @target.public_send(key) - end - - def []=(key, value) - @target.public_send("#{key}=", value) - end - - end - - # Wraps a Hash of errors, injecting prefixes - # - class ErrorProxy - - def initialize(errors, prefix) - @errors = errors - @prefix = prefix - end - - def []=(key, value) - errors[prefix + key] = value - end - - private - - attr_reader :errors - attr_reader :prefix - end end