Module: DeepClonable::InstanceMethods

Defined in:
lib/deep_clonable.rb

Instance Method Summary collapse

Instance Method Details

#cloneObject



10
11
12
13
14
15
# File 'lib/deep_clonable.rb', line 10

def clone
  was_frozen = frozen?
  cloned_object = super.dup
  cloned_object = yield(cloned_object) if block_given?
  was_frozen ? cloned_object.freeze : cloned_object
end

#deep_varsObject

You can override deep_vars in your class to specify which instance_variables should be deep cloned. As it is, all Arrays and Hashes are deep cloned.



31
32
33
34
35
36
# File 'lib/deep_clonable.rb', line 31

def deep_vars
  instance_variables.select do |var|
    value = instance_variable_get(var)
    value.kind_of?(Array) or value.kind_of?(Hash) or value.kind_of?(DeepClonable::InstanceMethods)
  end
end

#dup(method = :dup) ⇒ Object



17
18
19
20
21
# File 'lib/deep_clonable.rb', line 17

def dup(method = :dup)
  cloned_object = super()
  cloned_object.update_vars(deep_vars, method)
  cloned_object
end

#freezeObject



25
26
27
# File 'lib/deep_clonable.rb', line 25

def freeze
  dup(:freeze).old_freeze
end

#old_freezeObject



23
# File 'lib/deep_clonable.rb', line 23

alias old_freeze freeze

#update_vars(vars, method) ⇒ Object



38
39
40
41
42
43
# File 'lib/deep_clonable.rb', line 38

def update_vars(vars, method)
  vars.each do |var|
    value = instance_variable_get(var)
    instance_variable_set(var, value.send(method))
  end
end