lib/smart_kv.rb in smart_kv-0.1.0 vs lib/smart_kv.rb in smart_kv-0.1.1

- old
+ new

@@ -1,17 +1,22 @@ require "smart_kv/version" require "smart_kv/register" +require "smart_kv/macro" SmartKvInitializationError = Class.new(StandardError) class SmartKv extend Register + extend Macro - def initialize(required_keys = [], optional_keys = [], kv = {}) + attr_reader :object_class + + def initialize(required_keys = [], optional_keys = [], object_class = nil, kv = {}) prevent_direct_instantiation - @kv = kv + @object_class = object_class || kv.class + @kv = kv.dup hash = kv.to_h.dup missing_keys = required_keys - hash.keys unless missing_keys.empty? raise KeyError, "missing required key(s): #{missing_keys.map{|k| "`:#{k}'" }.join(', ')} in #{self.class}" @@ -22,10 +27,11 @@ raise NotImplementedError, "unrecognized key(s): #{unrecognized_keys.map{|k| "`:#{k}'" }.join(', ')} in #{self.class}" end end def method_missing(m, *args) - @kv.send(m, *args) + @object ||= @object_class <= Hash ? @kv : @object_class.new(@kv) + @object.send(m, *args) end protected def prevent_direct_instantiation