module Utils::IRB::Shell
def irb_info(obj, detailed = nil)
* detailed as 1..2 output instance methods of +obj+ inherited from parts 1
chain.
* detailed as 0 output instance methods only of part 0 (the first) of the
details about the methods (+ arity) in inheritance chain of +obj+ as well.
Output all kinds of information about +obj+. If detailed is given output
def irb_info(obj, detailed = nil) if Module === obj modul = obj klassp = Class === modul if klassp begin allocated = modul.allocate rescue TypeError else obj = allocated end end else modul = obj.class end inspected = obj.inspect puts "obj = #{inspected.size > 40 ? inspected[0, 40] + '...' : inspected} is of class #{obj.class}." am = irb_all_methods(obj).size ms = irb_methods(obj).size ems = irb_eigen_methods(obj).size puts "obj: #{am} methods, #{ms} only local#{ems > 0 ? " (#{ems} eigenmethods),": ','} #{am - ms} inherited/mixed in." acim = irb_all_class_instance_methods(obj).size cim = irb_class_instance_methods(obj).size puts "obj: #{acim} instance methods, #{cim} local, #{acim - cim} only inherited/mixed in." if klassp s = modul.superclass puts "Superclass of #{modul}: #{s}" end a = [] ec = true begin a << (class << obj; self; end) rescue TypeError ec = false end a.concat modul.ancestors if ec puts "Ancestors of #{modul}: (#{a[0]},) #{a[1..-1].map { |k| "#{k}#{k == s ? '*' : ''}" } * ', '}" else puts "Ancestors of #{modul}: #{a[0..-1].map { |k| "#{k}#{k == s ? '*' : ''}" } * ', '}" end if Class === modul and detailed if detailed.respond_to? :to_int detailed = detailed..detailed end detailed.each do |i| break if i >= a.size k = a[i] puts "#{k}:" puts irb_wrap_methods(obj, k.instance_methods(false)).sort end end nil end