module Utils::IRB::Shell

def irb_info(obj, detailed = nil)

and 2 of the the chain.
* 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