unless Array.instance_methods.include? "sort_by" class Array def sort_by n = -1 map{|i| [yield(i), n += 1, i]}.sort.map{|i| i.last} end end end def divclasstree(a, index) roots = a.find_all { |k| a.find_all{|i| k < i}.empty? } return roots if roots.empty? roots.sort_by{|i| i.name}.map { |r| [r, index[r] = divclasstree(a.find_all{|k| k < r}, index)] } end def classtree a = [] ObjectSpace.each_object do |o| a << o if o.is_a?(Class) end tree = divclasstree(a, index = {}) return tree, index end @tree, @index = classtree def dumpmethodtree(klass, lv, stack = []) print " "*lv, "* " puts klass.name klass.instance_methods.sort.each do |i| print " "*(lv+2), " - ", i puts stack.include?(i) ? " " : "" stack << i end subtree = @index[klass] subtree.each do |root, child| dumpmethodtree(root, lv+1, stack.dup) end end ARGV.each do |name| klass = ::Object for k in name.split("::") klass = klass.const_get(k) end dumpmethodtree(klass, 0) end