module Duplicate
Constants
- VERSION
Public Instance Methods
duplicate(object)
click to toggle source
# File lib/duplicate.rb, line 7 def duplicate(object) register = {} dup(register, object) end
Protected Instance Methods
dup(register, object)
click to toggle source
# File lib/duplicate.rb, line 24 def dup(register, object) return registered(object, register) if registered(object, register) return register_duplication(register, object, object) unless identifiable?(object) case object when Array dup_array(register, object) when Hash dup_hash(register, object) when Range dup_range(register, object) when Struct dup_struct(register, object) when NilClass, Symbol, Numeric, TrueClass, FalseClass, Method register_duplication(register, object, object) else dup_object(register, object) end end
dup_array(register, object)
click to toggle source
# File lib/duplicate.rb, line 58 def dup_array(register, object) duplication = dup_object(register, object) duplication.map! { |e| dup(register, e) } end
dup_hash(register, object)
click to toggle source
# File lib/duplicate.rb, line 63 def dup_hash(register, object) duplication = dup_object(register, object) object.reduce(duplication) { |hash, (k, v)| hash.merge!(dup(register, k) => dup(register, v)) } end
dup_instance_variables(register, object, duplication)
click to toggle source
# File lib/duplicate.rb, line 88 def dup_instance_variables(register, object, duplication) return duplication unless respond_to_instance_variables?(object) object.instance_variables.each do |instance_variable| value = get_instance_variable(object, instance_variable) set_instance_variable(duplication, instance_variable, dup(register, value)) end return duplication end
dup_object(register, object)
click to toggle source
# File lib/duplicate.rb, line 84 def dup_object(register, object) dup_instance_variables(register, object, register_duplication(register, object, try_dup(object))) end
dup_range(register, range)
click to toggle source
# File lib/duplicate.rb, line 68 def dup_range(register, range) register_duplication(register, range, range.class.new(dup(register, range.first), dup(register, range.last))) rescue register_duplication(register, range, range.dup) end
dup_struct(register, struct)
click to toggle source
# File lib/duplicate.rb, line 74 def dup_struct(register, struct) duplication = register_duplication(register, struct, struct.dup) struct.each_pair do |attr, value| duplication.__send__("#{attr}=", dup(register, value)) end duplication end
get_instance_variable(object, instance_variable_name)
click to toggle source
# File lib/duplicate.rb, line 100 def get_instance_variable(object, instance_variable_name) object.instance_variable_get(instance_variable_name) rescue NoMethodError object.instance_eval("#{instance_variable_name}") end
identifiable?(object)
click to toggle source
# File lib/duplicate.rb, line 52 def identifiable?(object) object.class && object.respond_to?(:is_a?) rescue NoMethodError false end
register_duplication(register, object, duplicate)
click to toggle source
# File lib/duplicate.rb, line 19 def register_duplication(register, object, duplicate) register[object.__id__]= duplicate duplicate end
registered(object, register)
click to toggle source
# File lib/duplicate.rb, line 15 def registered(object, register) register[object.__id__] end
respond_to_instance_variables?(object)
click to toggle source
# File lib/duplicate.rb, line 118 def respond_to_instance_variables?(object) object.respond_to?(:instance_variables) && object.instance_variables.is_a?(Array) rescue NoMethodError false end
set_instance_variable(duplicate, instance_variable_name, value_to_set)
click to toggle source
# File lib/duplicate.rb, line 106 def set_instance_variable(duplicate, instance_variable_name, value_to_set) duplicate.instance_variable_set(instance_variable_name, value_to_set) rescue NoMethodError duplicate.instance_eval("#{instance_variable_name} = Marshal.load(#{Marshal.dump(value_to_set).inspect})") end
try_dup(object)
click to toggle source
# File lib/duplicate.rb, line 112 def try_dup(object) object.dup rescue NoMethodError, TypeError object end