People often want to look at an object's attributes when debugging.
[1] Python has a handy dir() function that lists the attributes of an
object. And I use it tons. I often use obj.methods.sort in ruby for
the same purpose. But that doesn't show me class variables. There are
a handful of reflection functions to show different types of metadata
about an object.

So...this is my attempt to create a "Super dir() with extra-strength,
industrial, ruby power". I probably failed, and it's probably buggy as
I just hacked it together in about 15 minutes. In other words, I've
not tested it very extensively, YMMV (in fact your hair may
spontaneously catch on fire and you may start chanting backwards in
Latin...don't blame me; I've warned you!).

class DirObject
  def initialize(attrs=[])
    @attributes = attrs
  end
  def push(metadata)
    @attributes << metadata
  end
  def include?(test)
    @attributes.each { | key, value |
      return true if value.include?(test)
    }
    false
  end
  def show
    puts @attributes.map { | key, value |
      #key + ":\n  " + value.join("\n  ")
      key + ":\n  " + value.inspect
    }.join("\n\n")
    self
  end
end

class Object
private
  def _get_metadata(meta)
    begin
      send(meta)
    rescue NameError
      []
    end
  end
  def _format_meta(meta)
    unless (idx = meta.index("_")).nil?
      meta[0] = meta[0].chr.upcase
      meta[idx+1] = meta[idx+1].chr.upcase
      meta = meta[0..idx-1] + " " + meta[idx+1..-1]
    else
      meta[0] = meta[0].chr.upcase
      meta
    end
  end
  def _do_metadata(meta, dirobj)
    data = _get_metadata(meta)
    unless data.empty?
      meta = _format_meta(meta)
      dirobj.push([meta, data.sort])
    end
    dirobj
  end
public
  def dir(verbose=false)
    dirobj = DirObject.new
    _do_metadata("class_variables", dirobj)
    _do_metadata("instance_variables", dirobj)
    _do_metadata("methods", dirobj)
    _do_metadata("instance_methods", dirobj)
    if verbose
      _do_metadata("private_methods", dirobj)
      _do_metadata("private_instance_methods", dirobj)
      _do_metadata("protected_methods", dirobj)
      _do_metadata("protected_instance_methods", dirobj)
      _do_metadata("public_methods", dirobj)
      _do_metadata("public_instance_methods", dirobj)
      _do_metadata("singleton_methods", dirobj)
    end
    dirobj
  end
  def ls(verbose=false)
    dir(verbose).show
  end
end

Comments, corrections and criticisms welcome!

Ps. Object#dir actually prints the metadata (like python's dir()), and
#ls just gives you a DirObject which is really only useful to do an
includes? on (which searches for a value through the entire metadata).

http://monkeesage.prohosts.org/ruby/dir.rb [right-click save-as]

Regards,
Jordan

[1]
http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/d107b1318bbfdfd1/afa5a69d30007a64?lnk=gst&q=python+dir()#msg_77d85f05e1ae8e66