#include <string>
#include <iostream>

using std::string;
using std::ostream;

class XmlRpcFunction {
    string mFunctionName;
    string mMethodName;
    string mHelp;
    XmlRpcValue mSynopsis;

public: 
    XmlRpcFunction(const string& function_name,
		   const string& method_name,
		   const string& help,
		   XmlRpcValue synopsis);

    XmlRpcFunction (const XmlRpcFunction&);
    XmlRpcFunction& operator= (const XmlRpcFunction&);
    
    void printDeclarations (ostream& out);
    void printDefinitions  (ostream& out, const string& className);

private:
    void printParameters  (ostream& out, size_t synopsis_index);
    void printDeclaration (ostream& out, size_t synopsis_index);
    void printDefinition  (ostream& out,
			   const string& className,
			   size_t synopsis_index);

    const DataType& returnType (size_t synopsis_index);
    size_t parameterCount (size_t synopsis_index);
    const DataType& parameterType (size_t synopsis_index,
				   size_t parameter_index);
};