module Magick::RVG::Duplicatable

This is a standard deep_copy method that is used in most classes. Thanks to Robert Klemme.

Public Instance Methods

deep_copy(h = {}) click to toggle source
# File lib/rvg/misc.rb, line 8
def deep_copy(h = {})
  # Prevent recursion. If we reach the
  # object we started with, stop copying.
  copy = h[__id__]
  unless copy
    h[__id__] = copy = self.class.allocate
    ivars = instance_variables
    ivars.each do |ivar|
      ivalue = instance_variable_get(ivar)
      cvalue = if ivalue.is_a?(NilClass) || ivalue.is_a?(Symbol) || ivalue.is_a?(Float) || ivalue.is_a?(Integer) || ivalue.is_a?(FalseClass) || ivalue.is_a?(TrueClass)
                 ivalue
               elsif ivalue.respond_to?(:deep_copy)
                 ivalue.deep_copy(h)
               elsif ivalue.respond_to?(:dup)
                 ivalue.dup
               else
                 ivalue
               end
      copy.instance_variable_set(ivar, cvalue)
    end
    copy.freeze if frozen?
  end
  copy
end