# File lib/dm-core/spec/lib/spec_helper.rb, line 37
    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

        # skip "global" and non-DM objects
        next if object.kind_of?(DataMapper::Logger)                    ||
                object.kind_of?(DataMapper::DescendantSet)             ||
                object.kind_of?(DataMapper::Adapters::AbstractAdapter) ||
                object.class.name[0, 13] == 'DataObjects::'

        # skip classes and modules in the DataMapper namespace
        next if object.kind_of?(Module) &&
                !object.name.nil?       &&
                object.name[0, 12] == 'DataMapper::'

        # skip when the ivar is no longer defined in the object
        next unless object.instance_variable_defined?(ivar)

        value = object.instance_variable_get(ivar)

        # skip descendant sets
        next if value.kind_of?(DataMapper::DescendantSet)

        object.__send__(:remove_instance_variable, ivar) unless object.frozen?

        # skip when the value was seen
        next if seen.key?(value.object_id)
        seen[value.object_id] = true

        stack.concat value.instance_variables.map { |ivar| [ value, ivar ] }
      end
    end