summaryrefslogtreecommitdiff
path: root/lib/hashie/extensions/symbolize_keys.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/hashie/extensions/symbolize_keys.rb')
-rw-r--r--lib/hashie/extensions/symbolize_keys.rb13
1 files changed, 8 insertions, 5 deletions
diff --git a/lib/hashie/extensions/symbolize_keys.rb b/lib/hashie/extensions/symbolize_keys.rb
index 12d0669..274889c 100644
--- a/lib/hashie/extensions/symbolize_keys.rb
+++ b/lib/hashie/extensions/symbolize_keys.rb
@@ -15,7 +15,7 @@ module Hashie
# Return a new hash with all keys converted
# to symbols.
def symbolize_keys
- dup.symbolize_keys!
+ SymbolizeKeys.symbolize_keys(self)
end
module ClassMethods
@@ -23,9 +23,9 @@ module Hashie
# hashes and arrays.
# @api private
def symbolize_keys_recursively!(object)
- object.symbolize_keys! if object.respond_to? :symbolize_keys!
-
case object
+ when self.class
+ symbolize_keys!(object)
when ::Array
object.each do |i|
symbolize_keys_recursively!(i)
@@ -43,6 +43,7 @@ module Hashie
# Hashie.symbolize_keys! test
# test # => {:abc => 'def'}
def symbolize_keys!(hash)
+ hash.extend(Hashie::Extensions::SymbolizeKeys) unless hash.respond_to?(:symbolize_keys!)
hash.keys.each do |k|
symbolize_keys_recursively!(hash[k])
hash[k.to_sym] = hash.delete(k)
@@ -54,8 +55,10 @@ module Hashie
# to symbols.
# @param [::Hash] hash
def symbolize_keys(hash)
- hash.dup.tap do | new_hash |
- symbolize_keys! new_hash
+ copy = hash.dup
+ copy.extend(Hashie::Extensions::SymbolizeKeys) unless copy.respond_to?(:symbolize_keys!)
+ copy.tap do |new_hash|
+ symbolize_keys!(new_hash)
end
end
end