def parse_tree(*klasses)
result = []
klasses.each do |klass|
klassname = klass.name rescue ''
klassname = "UnnamedClass_#{klass.object_id}" if klassname.empty?
klassname = klassname.to_sym
code = if Class === klass then
sc = klass.superclass
sc_name = ((sc.nil? or sc.name.empty?) ? "nil" : sc.name).intern
[:class, klassname, [:const, sc_name]]
else
[:module, klassname]
end
method_names = []
method_names += klass.instance_methods false
method_names += klass.private_instance_methods false
method_names.sort.each do |m|
r = parse_tree_for_method(klass, m.to_sym)
code << r
end
mods = klass.modules
mods -= mods.map { |mod| mod.modules }.flatten
mods.each do |mod|
code << process("include #{mod}")
end
klass.singleton_methods(false).sort.each do |m|
code << parse_tree_for_method(klass, m.to_sym, true)
end
result << code
end
return result
end