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 |