def self.remove_ivars(object, instance_variables = object.instance_variables)
seen = {}
stack = instance_variables.map { |var| [ object, var ] }
while node = stack.pop
object, ivar = node
next if object.kind_of?(DataMapper::Logger) ||
object.kind_of?(DataMapper::DescendantSet) ||
object.kind_of?(DataMapper::Adapters::AbstractAdapter) ||
object.class.name[0, 13] == 'DataObjects::'
next if object.kind_of?(Module) &&
!object.name.nil? &&
object.name[0, 12] == 'DataMapper::'
next unless object.instance_variable_defined?(ivar)
value = object.instance_variable_get(ivar)
next if value.kind_of?(DataMapper::DescendantSet)
object.__send__(:remove_instance_variable, ivar) unless object.frozen?
next if seen.key?(value.object_id)
seen[value.object_id] = true
stack.concat value.instance_variables.map { |ivar| [ value, ivar ] }
end
end