Module: DeepClonable::InstanceMethods

Defined in:
lib/deep_clonable.rb

Instance Method Summary collapse

Instance Method Details

#clone {|cloned_object| ... } ⇒ Object

Yields:

  • (cloned_object)


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

def clone
  cloned_object = dup
  yield(cloned_object) if block_given?
  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

#dupObject



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

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

#freezeObject



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

def freeze
  update_vars(deep_vars, :freeze)
  old_freeze
end

#old_freezeObject



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

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