#!/usr/bin/env ruby

module DCOP

  def dump_all_apps

    `dcop`.split(/\n/).each do

      |app|

      DCOP.dump_app(app)

    end

  end

  def dump_app(app)

    print "<app name=\"#{app}\">\n"

    `dcop #{app}`.split(/\n/).each do

      |object|

      DCOP.dump_object(app, object)

    end

    print "</app>\n"

  end

  def dump_object(app, object)

    object.gsub!(/\(default\)/, '')
    object.strip!

    print "  <object name=\"#{object}\">\n" unless object == "(default)"

    `dcop #{app} #{object}`.split(/\n/).each do

      |method|

      DCOP.dump_method(app, object, method)

    end

    print "  </object>\n"

  end

  def dump_method(app, object, method)

    return_type, method_name, arg_str = method.split(/[ \(]/, 3)

    arg_str.gsub!(/\)$/, '')

    arg_list = arg_str.split(',')

    print "    <method name=\"#{method_name}\" return-type=\"#{return_type}\""

    if arg_list.empty?

      print "/>\n"
      return

    else

      print ">\n"

      arg_list.each do

        |arg|

        type, name = arg.split

        print "      <parameter name=\"#{name}\" type=\"#{type}\"/>\n"

      end

      print "    </method>\n"

    end

  end

  module_function :dump_all_apps, :dump_app, :dump_object, :dump_method

end

DCOP.dump_all_apps if __FILE__ == $0