summaryrefslogtreecommitdiff
path: root/lib/hashie/extensions/deep_merge.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/hashie/extensions/deep_merge.rb')
-rw-r--r--lib/hashie/extensions/deep_merge.rb17
1 files changed, 16 insertions, 1 deletions
diff --git a/lib/hashie/extensions/deep_merge.rb b/lib/hashie/extensions/deep_merge.rb
index 5363904..1890e8f 100644
--- a/lib/hashie/extensions/deep_merge.rb
+++ b/lib/hashie/extensions/deep_merge.rb
@@ -3,7 +3,7 @@ module Hashie
module DeepMerge
# Returns a new hash with +self+ and +other_hash+ merged recursively.
def deep_merge(other_hash, &block)
- copy = dup
+ copy = _deep_dup(self)
copy.extend(Hashie::Extensions::DeepMerge) unless copy.respond_to?(:deep_merge!)
copy.deep_merge!(other_hash, &block)
end
@@ -18,6 +18,21 @@ module Hashie
private
+ def _deep_dup(hash)
+ copy = hash.dup
+
+ copy.each do |key, value|
+ copy[key] =
+ if value.is_a?(::Hash)
+ _deep_dup(value)
+ else
+ Hashie::Utils.safe_dup(value)
+ end
+ end
+
+ copy
+ end
+
def _recursive_merge(hash, other_hash, &block)
other_hash.each do |k, v|
hash[k] =