module ObjectSpace
  class << self
    include Enumerable
    alias_method :each, :each_object
  end
  def self.modules
    self.select {|obj| obj.is_a?(Module) }
  end
end

class Dog
end

before = ObjectSpace.modules

require 'openbabel'

after = ObjectSpace.modules

modules = (after - before).reject {|mod| mod.to_s =~ /SWIG/i }

class Object
  def arity_hash
    uniq = self.methods - (Object.new.methods + Object.methods)
    Hash[ uniq.map do |name|
      [name.to_s, self.method(name).arity]
    end
    ]
  end
end

modules.each do |mod|
  obj_hash = 
    if mod.respond_to?(:allocate) 
      begin
        obj = mod.allocate
        obj.arity_hash
      rescue
        {}
      end
    else
      {}
    end
  klss_hash = mod.arity_hash
  if (obj_hash.size + klss_hash.size) > 0
    puts "*" * 50
    puts mod
    puts "*" * 50
    puts obj_hash.map {|pair| pair.join(" ") }
    puts klss_hash.map {|pair| pair.join(" ") }
  end
end