Module: Cloneable

Defined in:
lib/mixers/cloneable.rb

Overview

Clonable

Standard basis for adding deep #dup and #clone to a class. Provides a class with deep cloneablity via the standard #dup and #clone methods.

Credit

Cloneable was originally ported from Jim Weirich’s Rake. The current version is the work of Ken Bloom.

– TODO: Is there a more robust means of determining if clone or dup is used? ++

Instance Method Summary collapse

Instance Method Details

#initialize_copy(sibling) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/mixers/cloneable.rb', line 18

def initialize_copy(sibling)
  #first duplicate my superclass' state. Note that if it's duplicating
  #instance variables, this will be overwritten, but this is important
  #because we could be dealing with a C extension with state hidden from
  #the Ruby interpreter
  super

  #we want to know if we're being dup'ed or clone'd, because we want to
  #preserve the state of our internals the same way our state is being
  #preserved. (If we can't figure it out, we'll just use #dup.)
  operation = caller.find{|x| x !~ /'initialize_copy'/}.match(/`(dup|clone)'/)[1] or :dup

  sibling.instance_variables.each do |ivar|
    value = sibling.instance_variable_get(ivar)

    #set my instance variable to be a #dup or #clone
    #or my sibling, depending on what's happening to me right now
    instance_variable_set(ivar, value.send(operation))
  end
end