oop/copy_hooks.rb

tests/_examples/oop/copy_hooks.rb in the metorex repository.

class Tracker
  attr_reader :log

  def initialize
    @log = []
  end

  def initialize_copy(source)
    @log = source.log + ["copied"]
  end
end

original = Tracker.new
puts original.dup.log.inspect

plain = Object.new
puts plain.send(:initialize_copy, plain).equal?(plain)
puts plain.send(:initialize_clone, Object.new).equal?(plain)
puts plain.send(:initialize_dup, Object.new).equal?(plain)

begin
  Object.new.freeze.send(:initialize_copy, Object.new)
rescue FrozenError => error
  puts error.class
end

begin
  1.send(:initialize_copy, Object.new)
rescue FrozenError => error
  puts error.class
end

class Parent
end

class Child < Parent
end

begin
  Parent.new.send(:initialize_copy, Child.new)
rescue TypeError => error
  puts error.message
end

puts Kernel.private_instance_methods.include?(:initialize_copy)

Output:

["copied"]
true
true
true
FrozenError
FrozenError
initialize_copy should take same class object
true