diff options
author | Lucas Nestor <lnestor@covermymeds.com> | 2018-08-02 16:05:21 -0400 |
---|---|---|
committer | Michael Herold <opensource@michaeljherold.com> | 2018-08-11 21:45:43 -0500 |
commit | 1d943216394f1b4a4eb7e0584144aaeeefa1e19a (patch) | |
tree | 437d95976cb0bfc9646708fb81b38cbc10ee5483 /lib | |
parent | 7b415991772fa3f6ac30ca44b34c2c92b0114b08 (diff) | |
download | hashie-1d943216394f1b4a4eb7e0584144aaeeefa1e19a.tar.gz |
Add MethodOverridingInitializer extension
Diffstat (limited to 'lib')
-rw-r--r-- | lib/hashie/extensions/method_access.rb | 54 |
1 files changed, 43 insertions, 11 deletions
diff --git a/lib/hashie/extensions/method_access.rb b/lib/hashie/extensions/method_access.rb index e1ad56a..cf13da0 100644 --- a/lib/hashie/extensions/method_access.rb +++ b/lib/hashie/extensions/method_access.rb @@ -154,6 +154,22 @@ module Hashie end end + # A module shared between MethodOverridingWriter and MethodOverridingInitializer + # to contained shared logic. This module aids in redefining existing hash methods. + module RedefineMethod + protected + + def method?(name) + methods.map(&:to_s).include?(name) + end + + def redefine_method(method_name) + eigenclass = class << self; self; end + eigenclass.__send__(:alias_method, "__#{method_name}", method_name) + eigenclass.__send__(:define_method, method_name, -> { self[method_name] }) + end + end + # MethodOverridingWriter gives you #key_name= shortcuts for # writing to your hash. It allows methods to be overridden by # #key_name= shortcuts and aliases those methods with two @@ -179,6 +195,8 @@ module Hashie # h.__zip # => [[['awesome', 'sauce'], ['zip', 'a-dee-doo-dah']]] # module MethodOverridingWriter + include RedefineMethod + def convert_key(key) key.to_s end @@ -203,16 +221,6 @@ module Hashie def already_overridden?(name) method?("__#{name}") end - - def method?(name) - methods.map(&:to_s).include?(name) - end - - def redefine_method(method_name) - eigenclass = class << self; self; end - eigenclass.__send__(:alias_method, "__#{method_name}", method_name) - eigenclass.__send__(:define_method, method_name, -> { self[method_name] }) - end end # A macro module that will automatically include MethodReader, @@ -223,10 +231,34 @@ module Hashie # underscores. module MethodAccessWithOverride def self.included(base) - [MethodReader, MethodOverridingWriter, MethodQuery].each do |mod| + [MethodReader, MethodOverridingWriter, MethodQuery, MethodOverridingInitializer].each do |mod| base.send :include, mod end end end + + # MethodOverridingInitializer allows you to override default hash + # methods when passing in values from an existing hash. The overriden + # methods are aliased with two leading underscores. + # + # @example + # class MyHash < Hash + # include Hashie::Extensions::MethodOverridingInitializer + # end + # + # h = MyHash.new(zip: 'a-dee-doo-dah') + # h.zip # => 'a-dee-doo-dah' + # h.__zip # => [[['zip', 'a-dee-doo-dah']]] + module MethodOverridingInitializer + include RedefineMethod + + def initialize(hash = {}) + hash.each do |key, value| + skey = key.to_s + redefine_method(skey) if method?(skey) + self[skey] = value + end + end + end end end |