module ObjectSpace
  def self.each_object(target_klass, &block)
    klasses = [Object]
    i = 0
    loop do
      klass = klasses[i]
      yield klass
      names = `klass.$$const` && `Object.keys(klass.$$const)`
      names.each do |name|
        begin
          k = klass.const_get(name) rescue nil
          next unless `k.$$const`
          next unless k.respond_to?(:is_a?)
          next if klasses.include?(k)

          klasses << k if k.is_a? target_klass
        rescue Exception => e
          next
        end
      end if names
      i += 1
      break if i >= klasses.length
    end
  end
end