diff --git a/compiler/py/Makefile.am b/compiler/py/Makefile.am
deleted file mode 100644
index 8b84d0a..0000000
--- a/compiler/py/Makefile.am
+++ /dev/null
@@ -1,2 +0,0 @@
-install-exec-hook:
-	$(PYTHON) setup.py install install_scripts --install-dir=$(bindir)
diff --git a/compiler/py/bootstrap.sh b/compiler/py/bootstrap.sh
deleted file mode 100755
index 11f41a9..0000000
--- a/compiler/py/bootstrap.sh
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/sh
-
-rm -rf \
-AUTHORS \
-COPYING \
-ChangeLog \
-INSTALL \
-Makefile \
-Makefile.in \
-Makefile.orig \
-NEWS \
-README \
-aclocal.m4 \
-autom4te.cache \
-autoscan.log \
-config.guess \
-config.h \
-config.hin \
-config.log \
-config.status \
-config.sub \
-configure \
-configure.scan \
-depcomp \
-.deps \
-install-sh \
-.libs \
-libtool \
-ltmain.sh \
-Makefile.in \
-missing
-
-aclocal
-touch NEWS README AUTHORS ChangeLog
-autoconf
-automake -ac
diff --git a/compiler/py/configure.ac b/compiler/py/configure.ac
deleted file mode 100644
index dcc7bf2..0000000
--- a/compiler/py/configure.ac
+++ /dev/null
@@ -1,13 +0,0 @@
-AC_PREREQ(2.59)
-
-AC_INIT([compiler], [1.0])
-
-AC_CONFIG_AUX_DIR([.])
-
-AM_INIT_AUTOMAKE
-
-AM_PATH_PYTHON(2.4,, :)
-
-AC_CONFIG_FILES([Makefile])
-
-AC_OUTPUT
diff --git a/compiler/py/setup.py b/compiler/py/setup.py
deleted file mode 100644
index 7167181..0000000
--- a/compiler/py/setup.py
+++ /dev/null
@@ -1,13 +0,0 @@
-from distutils.core import setup
-
-setup(name = 'Thrift',
-      version = '1.0',
-      description = 'Thrift IDL compiler',
-      author = ['Mark Slee', 'Marc Kwiatkowski'],
-      author_email = ['mcslee@facebook.com', 'marc@facebook.com'],
-      url = 'http://code.facebook.com/thrift',
-      package_dir = {'thrift' : 'src'},
-      py_modules = ['thrift.parser', 'thrift.cpp_generator', 'thrift.generator', 'thrift.php_generator'],
-      scripts = ['src/thrift']
-      )
-
diff --git a/compiler/py/src/__init__.py b/compiler/py/src/__init__.py
deleted file mode 100644
index 440be4f..0000000
--- a/compiler/py/src/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-__all__ = ['parser', 'generator', 'cpp_generator', 'php_generator']
diff --git a/compiler/py/src/cpp_generator.py b/compiler/py/src/cpp_generator.py
deleted file mode 100644
index bdd251d..0000000
--- a/compiler/py/src/cpp_generator.py
+++ /dev/null
@@ -1,1322 +0,0 @@
-import time
-import os
-import os.path
-from string import Template
-from thrift.parser import *
-from thrift.generator import *
-
-HEADER_COMMENT = """/**
- * Autogenerated by Thrift
- * ${date}
- *
- * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
- */
- """
-
-CPP_TYPES_HEADER = Template(HEADER_COMMENT+"""
-#if !defined(${source}_types_h_)
-#define ${source}_types_h_ 1
-
-#include <Thrift.h>
-${namespacePrefix}
-""")
-
-CPP_TYPES_FOOTER = Template("""
-${namespaceSuffix}
-#endif // !defined(${source}_types_h_)
-""")
-
-CPP_SERVICES_HEADER = Template(HEADER_COMMENT+"""
-#if !defined(${source}_h_)
-#define ${source}_h_ 1
-
-#include <Thrift.h>
-#include <TProcessor.h>
-#include <protocol/TProtocol.h>
-#include <transport/TTransport.h>
-#include \"${source}_types.h\"
-
-${namespacePrefix}
-""")
-
-CPP_SERVICES_FOOTER = Template("""
-${namespaceSuffix}
-#endif // !defined(${source}_h_)""")
-
-CPP_IMPL_HEADER = Template(HEADER_COMMENT+"""
-#include \"${source}.h\"
-
-${namespacePrefix}
-""")
-
-CPP_IMPL_FOOTER = Template("""
-${namespaceSuffix}
-""")
-
-def cpp_debug(arg):
-    print(arg)
-
-class Indenter(object):
-    def __init__(self, level=0, step=4):
-	self.level = level
-	self.step = step
-	self.chunk = ""
-	for i in range(step):
-	    self.chunk+= " "
-	self.prefix=""
-
-    def inc(self):
-	self.level+= self.step
-	self.prefix += self.chunk
-
-    def dec(self):
-	self.level-= self.step
-	if(self.level < 0):
-	    raise Exception, "Illegal indent level"
-	self.prefix = self.prefix[:self.level]
-
-    def __call__(self):
-	return  self.prefix
-
-class CFile(file):
-
-    def __init__(self, name, flags):
-        file.__init__(self, name, flags)
-        self.indent = Indenter()
-        self.newline = True
-
-    def rwrite(self, value):
-        file.write(self, value)
-
-    def write(self, value=""):
-        if self.newline:
-            self.rwrite(self.indent())
-            self.newline = False
-        self.rwrite(value)
-
-    def writeln(self, value=""):
-        self.write(value+"\n")
-        self.newline = True
-
-    def beginBlock(self):
-        self.writeln("{")
-        self.indent.inc();
-
-    def endBlock(self, suffix=""):
-        self.indent.dec();
-        self.writeln("}"+suffix)
-
-CPP_PRIMITIVE_MAP = {
-    "void" : "void",
-    "bool" : "bool",
-    "string": "std::string",
-    "utf7": "std::string",
-    "utf8": "std::wstring",
-    "utf16": "std::utf16",
-    "byte" : "uint8_t",
-    "i08": "int8_t",
-    "i16": "int16_t",
-    "i32": "int32_t",
-    "i64": "int64_t",
-    "u08": "uint8_t",
-    "u16": "uint16_t",
-    "u32": "uint32_t",
-    "u64": "uint64_t",
-    "float": "float",
-    "double": "double"
-}
-
-CPP_CONTAINER_MAP = {
-    MapType : "std::map",
-    ListType: "std::list",
-    SetType : "std::set",
-}
-
-def toCNamespacePrefix(namespace):
-    if not namespace:
-	return ""
-    else:
-	return string.join(["namespace "+token + " {" for token in string.split(namespace, ".")], " ")
-
-def toCNamespaceSuffix(namespace):
-    if not namespace:
-	return ""
-    else:
-	return string.join(["}" for token in string.split(namespace, ".")], "")
-
-def toCTypeDeclaration(ttype):
-    """ Converts the thrift IDL type to the corresponding C/C++ type.  Note that if ttype is FieldType, this function c
-converts to type declaration followed by field name, i.e. \"string string_thing\""""
-
-    if isinstance(ttype, PrimitiveType):
-        return CPP_PRIMITIVE_MAP[ttype.name]
-
-    elif isinstance(ttype, CollectionType):
-
-        result = CPP_CONTAINER_MAP[type(ttype)]+"<"
-        
-        if isinstance(ttype, MapType):
-            result+= toCTypeDeclaration(ttype.keyType)+", "+ toCTypeDeclaration(ttype.valueType)
-
-        elif isinstance(ttype, SetType) or isinstance(ttype, ListType):
-            result+= toCTypeDeclaration(ttype.valueType)
-
-        else:
-            raise Exception, "Unknown Collection Type "+str(ttype)
-
-        result+= "> "
-
-        return result
-
-    elif isinstance(ttype, StructType):
-        return "struct "+ttype.name
-
-    elif isinstance(ttype, TypedefType):
-        return ttype.name;
-
-    elif isinstance(ttype, EnumType):
-        return ttype.name;
-
-    elif isinstance(ttype, Function):
-        result = toCTypeDeclaration(ttype.returnType())+ " "+ttype.name+"("+string.join([toCTypeDeclaration(arg) for arg in ttype.args()], ", ")+")"
-	if len(ttype.exceptions()):
-	    result+= " throw("+string.join([toCTypeDeclaration(exceptions.type) for exceptions in ttype.exceptions()], ", ")+")"
-	return result
-
-    elif isinstance(ttype, Field):
-        return toCTypeDeclaration(ttype.type)+ " "+ttype.name
-
-    else:
-        raise Exception, "Unknown type "+str(ttype)
-
-def toTypeDefDefinition(typedef):
-    """ Converts a thrift typedef to a C/C++ typedef """
-
-    return "typedef "+toCTypeDeclaration(typedef.definitionType)+" "+typedef.name+";"
-
-def toEnumDefinition(enum):
-    """ Converts a thrift enum to a C/C++ enum """
-
-    result = "enum "+enum.name+" {\n"
-
-    first = True
-
-    for ed in enum.enumDefs:
-        if first:
-            first = False
-        else:
-            result+= ",\n"
-        result+= "    "+ed.name+" = "+str(ed.id)
-
-    result+= "\n};\n"
-
-    return result
-
-def toStructDefinition(struct):
-    """Converts a thrift struct to a C/C++ struct"""
-
-    result = "struct "+struct.name+" {\n"
-
-    # Create constructor defaults for primitive types
-
-    ctorValues = string.join([field.name+"(0)" for field in struct.fieldList if isinstance(toCanonicalType(field.type), PrimitiveType) and toCanonicalType(field.type) not in [STRING_TYPE, UTF8_TYPE, UTF16_TYPE, VOID_TYPE]], ", ")
-
-    if len(ctorValues) > 0:
-	result+= "    "+struct.name+"() : "+ctorValues+ " {}\n" 
-
-    # Field declarations
-
-    result+= string.join(["    "+toCTypeDeclaration(field)+";\n" for field in struct.fieldList if not isVoidType(field.type)], "")
-
-    # is-field-set struct and ctor
-
-    ctorValues = string.join([field.name+"(false)" for field in struct.fieldList if not isVoidType(field.type)], ", ")
-
-    if len(ctorValues) > 0:
-	result+= "    struct __isset {\n"
-	result+= "        __isset() : "+ctorValues+" {}\n"
-	result+= string.join(["        bool "+field.name+";\n" for field in struct.fieldList if not isVoidType(field.type)], "")
-        result+= "   } __isset;\n"
-
-    # bring it on home
-
-    result+= "};\n"
-
-    return result
-
-CPP_DEFINITION_MAP = {
-    TypedefType : toTypeDefDefinition,
-    EnumType : toEnumDefinition,
-    StructType : toStructDefinition,
-    ExceptionType : toStructDefinition,
-    Service : None
-    }
-    
-def toDefinitions(definitions):
-    """Converts an arbitrafy thrift grammatical unit definition to the corresponding C/C++ definition"""
-
-    result = ""
-
-    for definition in definitions:
-
-        writer = CPP_DEFINITION_MAP[type(definition)]
-
-        if writer:
-            result+= writer(definition)+"\n"
-
-    return result
-
-CPP_THRIFT_NS = "facebook::thrift"
-
-CPP_INTERFACE_FUNCTION_DECLARATION = Template("""    virtual ${functionDeclaration} = 0;
-""")
-
-CPP_INTERFACE_DECLARATION = Template("""
-class ${service}If {
-    public:
-    virtual ~${service}If() {}
-${functionDeclarations}};
-""")
-
-def toServiceInterfaceDeclaration(service, debugp=None):
-    """Converts a thrift service definition into a C++ abstract base class"""
-
-    functionDeclarations = string.join([CPP_INTERFACE_FUNCTION_DECLARATION.substitute(service=service.name, functionDeclaration=toCTypeDeclaration(function)) for function in service.functionList], "")
-
-    return CPP_INTERFACE_DECLARATION.substitute(service=service.name, functionDeclarations=functionDeclarations)
-
-CPP_EXCEPTION = CPP_THRIFT_NS+"::Exception"
-
-CPP_SP = Template("boost::shared_ptr<${klass}> ")
-
-CPP_PROCESSOR = CPP_THRIFT_NS+"::TProcessor"
-CPP_PROCESSORP = CPP_SP.substitute(klass=CPP_PROCESSOR)
-
-CPP_PROTOCOL_NS = CPP_THRIFT_NS+"::protocol"
-CPP_PROTOCOL = CPP_PROTOCOL_NS+"::TProtocol"
-CPP_PROTOCOLP = CPP_SP.substitute(klass="const "+CPP_PROTOCOL)
-
-
-CPP_TRANSPORT_NS = CPP_THRIFT_NS+"::transport"
-CPP_TRANSPORT = CPP_TRANSPORT_NS+"::TTransport"
-CPP_TRANSPORTP = CPP_SP.substitute(klass=CPP_TRANSPORT)
-
-CPP_PROTOCOL_TSTOP = CPP_PROTOCOL_NS+"::T_STOP"
-CPP_PROTOCOL_TTYPE = CPP_PROTOCOL_NS+"::TType"
-CPP_PROTOCOL_MESSAGE_TYPE = CPP_PROTOCOL_NS+"::TMessageType"
-CPP_PROTOCOL_CALL = CPP_PROTOCOL_NS+"::T_CALL"
-CPP_PROTOCOL_REPLY = CPP_PROTOCOL_NS+"::T_REPLY"
-
-CPP_TTYPE_MAP = {
-    STOP_TYPE : CPP_PROTOCOL_NS+"::T_STOP",
-    VOID_TYPE : CPP_PROTOCOL_NS+"::T_VOID",
-    BOOL_TYPE : CPP_PROTOCOL_NS+"::T_BOOL",
-    UTF7_TYPE : CPP_PROTOCOL_NS+"::T_UTF7",
-    UTF7_TYPE : CPP_PROTOCOL_NS+"::T_UTF7",
-    UTF8_TYPE : CPP_PROTOCOL_NS+"::T_UTF8",
-    UTF16_TYPE : CPP_PROTOCOL_NS+"::T_UTF16",
-    U08_TYPE : CPP_PROTOCOL_NS+"::T_U08",
-    I08_TYPE : CPP_PROTOCOL_NS+"::T_I08",
-    I16_TYPE : CPP_PROTOCOL_NS+"::T_I16",
-    I32_TYPE : CPP_PROTOCOL_NS+"::T_I32",
-    I64_TYPE : CPP_PROTOCOL_NS+"::T_I64",
-    U08_TYPE : CPP_PROTOCOL_NS+"::T_U08",
-    U16_TYPE : CPP_PROTOCOL_NS+"::T_U16",
-    U32_TYPE : CPP_PROTOCOL_NS+"::T_U32",
-    U64_TYPE : CPP_PROTOCOL_NS+"::T_U64",
-    FLOAT_TYPE : CPP_PROTOCOL_NS+"::T_FLOAT",
-    DOUBLE_TYPE : CPP_PROTOCOL_NS+"::T_DOUBLE",
-    StructType : CPP_PROTOCOL_NS+"::T_STRUCT",
-    ExceptionType : CPP_PROTOCOL_NS+"::T_STRUCT",
-    ListType : CPP_PROTOCOL_NS+"::T_LIST",
-    MapType : CPP_PROTOCOL_NS+"::T_MAP",
-    SetType : CPP_PROTOCOL_NS+"::T_SET"
-}
-
-
-CPP_SERVER_FUNCTION_DECLARATION = Template("""    void process_${function}(uint32_t seqid, """+CPP_TRANSPORTP+""" itrans, """+CPP_TRANSPORTP+""" otrans);
-""")
-
-CPP_SERVER_FUNCTION_DEFINITION = Template("""
-void ${service}ServerIf::process_${function}(uint32_t seqid, """+CPP_TRANSPORTP+""" itrans, """+CPP_TRANSPORTP+""" otrans) {
-
-    uint32_t xfer = 0;
-
-    ${argsStructDeclaration};
-
-    ${argsStructReader};
-
-    _iprot->readMessageEnd(itrans);
-
-    ${resultStructDeclaration};
-
-    ${functionCall}
-
-    _oprot->writeMessageBegin(otrans, \"${function}\", """+CPP_PROTOCOL_REPLY+""", seqid);
-
-    ${resultStructWriter};
-
-    _oprot->writeMessageEnd(otrans);
-
-    otrans->flush();
-}
-""")
-
-CPP_SERVER_PROCESS_DEFINITION = Template("""
-bool ${service}ServerIf::process("""+CPP_TRANSPORTP+""" itrans, """+CPP_TRANSPORTP+""" otrans) {
-
-    std::string name;
-
-    """+CPP_PROTOCOL_MESSAGE_TYPE+""" messageType;
-
-    uint32_t seqid;
-
-    _iprot->readMessageBegin(itrans, name, messageType, seqid);
-
-    if(messageType == """+CPP_PROTOCOL_CALL+""") {
-${callProcessSwitch}
-    } else {
-        throw """+CPP_EXCEPTION+"""(\"Unexpected message type\");     
-    }
-
-    return true;
-}
-""")
-
-def toWireType(ttype):
-    """Converts a thrift type to the corresponding wire type.   This differs from toCTypeDeclaration in that it reduces typedefs
-to their canonical form and converts enums to signedf 32 bit integers"""
-
-    if isinstance(ttype, PrimitiveType):
-	return CPP_TTYPE_MAP[ttype]
-
-    elif isinstance(ttype, EnumType):
-	return CPP_TTYPE_MAP[I32_TYPE]
-
-    elif isinstance(ttype, TypedefType):
-	return toWireType(toCanonicalType(ttype))
-
-    elif isinstance(ttype, StructType) or isinstance(ttype, CollectionType):
-	return CPP_TTYPE_MAP[type(ttype)]
-
-    else:
-	raise Exception, "No wire type for thrift type: "+str(ttype)
-
-CPP_SERVER_DECLARATION = Template("""
-class ${service}ServerIf : public ${service}If, public """+CPP_PROCESSOR+""" {
-    public:
-    ${service}ServerIf("""+CPP_PROTOCOLP+""" protocol): _iprot(protocol), _oprot(protocol) {}
-    ${service}ServerIf("""+CPP_PROTOCOLP+""" iprot, """+CPP_PROTOCOLP+""" oprot) : _iprot(iprot), _oprot(oprot) {}
-    virtual ~${service}ServerIf() {}
-    bool process("""+CPP_TRANSPORTP+""" _itrans,"""+CPP_TRANSPORTP+""" _otrans);
-    protected:
-    """+CPP_PROTOCOLP+""" _iprot;
-    """+CPP_PROTOCOLP+""" _oprot;
-    private:
-${functionDeclarations}};
-""")
-
-def toServerDeclaration(service, debugp=None):
-    """Converts a thrift service definition to the Server skeleton class declaration."""
-
-    functionDeclarations = string.join([CPP_SERVER_FUNCTION_DECLARATION.substitute(function=function.name) for function in service.functionList], "")
-
-    return CPP_SERVER_DECLARATION.substitute(service=service.name, functionDeclarations=functionDeclarations)
-    
-CPP_CLIENT_FUNCTION_DECLARATION = Template("""    ${functionDeclaration};
-""")
-
-
-CPP_CLIENT_FUNCTION_DEFINITION = Template("""
-${returnDeclaration} ${service}Client::${function}(${argsDeclaration}) ${exceptionDeclaration} {
-
-    uint32_t xfer = 0;
-    std::string name;
-    """+CPP_PROTOCOL_MESSAGE_TYPE+""" messageType;
-    uint32_t cseqid = 0;
-    uint32_t rseqid = 0;
-
-    _oprot->writeMessageBegin(_otrans, \"${function}\", """+CPP_PROTOCOL_CALL+""", cseqid);
-
-    ${argsStructDeclaration};
-
-${argsToStruct};
-
-    ${argsStructWriter};
-
-    _otrans->flush();
-
-    _iprot->readMessageBegin(_itrans, name, messageType, rseqid);
-
-    if(messageType != """+CPP_PROTOCOL_REPLY+""" || 
-       rseqid != cseqid) {
-        throw """+CPP_EXCEPTION+"""(\"unexpected message type or id\");
-    }
-
-    ${resultStructDeclaration};
-
-    ${resultStructReader};
-
-    _iprot->readMessageEnd(_itrans);
-
-${returnResult}
-    throw """+CPP_EXCEPTION+"""(\"${function} failed: unknown result\");
-}
-""")
-
-CPP_CLIENT_DECLARATION = Template("""
-class ${service}Client : public ${service}If {
-
-    public:
-
-    ${service}Client("""+CPP_TRANSPORTP+""" transport, """+CPP_PROTOCOLP+""" protocol): _itrans(transport), _otrans(transport), _iprot(protocol), _oprot(protocol) {}
-
-    ${service}Client("""+CPP_TRANSPORTP+""" itrans, """+CPP_TRANSPORTP+""" otrans, """+CPP_PROTOCOLP+""" iprot, """+CPP_PROTOCOLP+""" oprot) : _itrans(itrans), _otrans(otrans), _iprot(iprot), _oprot(oprot) {}
-
-${functionDeclarations}
-    private:
-    """+CPP_TRANSPORTP+""" _itrans;
-    """+CPP_TRANSPORTP+""" _otrans;
-    """+CPP_PROTOCOLP+""" _iprot;
-    """+CPP_PROTOCOLP+""" _oprot;
-};""")
-
-def toServerFunctionDefinition(servicePrefix, function, debugp=None):
-    """Converts a thrift service method declaration into a server method-call processoror function"""
-    result = ""
-
-    argsStructDeclaration = toCTypeDeclaration(function.argsStruct)+" __args"
-
-    argsStructReader = toReaderCall("__args", function.argsStruct, "_iprot")
-
-    resultStructDeclaration = toCTypeDeclaration(function.resultStruct)+" __result"
-
-    resultStructWriter = toWriterCall("__result", function.resultStruct, "_oprot")
-
-    if not isVoidType(function.returnType()):
-	functionCallPrefix= "__result.success = "
-	functionCallSuffix = "\n    __result.__isset.success = true;"
-    else:
-	functionCallPrefix = ""
-	functionCallSuffix = ""
-
-    functionCall= function.name+"("+string.join(["__args."+arg.name for arg in function.args()], ", ")+");"
-
-    exceptions = function.exceptions()
-
-    if len(exceptions) > 0:
-	functionCallPrefix= "try {\n        "+functionCallPrefix
-
-	functionCallSuffix+= "\n    }"+string.join([" catch("+toCTypeDeclaration(exceptions[ix].type)+"& e"+str(ix)+") {\n        __result."+exceptions[ix].name+" = e"+str(ix)+";\n        __result.__isset."+exceptions[ix].name+" = true;\n    }" 
-		     for ix in range(len(exceptions))], "")
-
-    functionCall = functionCallPrefix+functionCall+functionCallSuffix
-
-    result+= CPP_SERVER_FUNCTION_DEFINITION.substitute(service=servicePrefix, function=function.name,
-						       argsStructDeclaration=argsStructDeclaration, 
-						       argsStructReader=argsStructReader, 
-						       functionCall=functionCall,
-						       resultStructDeclaration=resultStructDeclaration,
-						       resultStructWriter=resultStructWriter)
-    return result
-
-def toServerServiceDefinition(service, debugp=None):
-    """Converts a thrift service definiton to a server skeleton implementation"""
-
-    result = ""
-
-    for function in service.functionList:
-	
-	result+= toServerFunctionDefinition(service.name, function, debugp)
-    
-    callProcessSwitch = "        if"+string.join(["(name.compare(\""+function.name+"\") == 0) {\n            process_"+function.name+"(seqid, itrans, otrans);\n        }" for function in service.functionList], " else if")+" else {\n            throw "+CPP_EXCEPTION+"(\"Unknown function name \\\"\"+name+\"\\\"\");\n        }"
-
-    result+= CPP_SERVER_PROCESS_DEFINITION.substitute(service=service.name, callProcessSwitch=callProcessSwitch)
-
-    return result
-
-def toServerDefinition(program, debugp=None):
-
-    return string.join([toServerServiceDefinition(service) for service in program.serviceMap.values()], "\n")
-
-def toClientDeclaration(service, debugp=None):
-
-    functionDeclarations = string.join([CPP_CLIENT_FUNCTION_DECLARATION.substitute(functionDeclaration=toCTypeDeclaration(function)) for function in service.functionList], "")
-
-    return CPP_CLIENT_DECLARATION.substitute(service=service.name, functionDeclarations=functionDeclarations)+"\n"
-
-def toClientFunctionDefinition(servicePrefix, function, debugp=None):
-    """Converts a thrift service method declaration to a client stub implementation"""
-
-    isVoid = isVoidType(function.returnType())
-
-    returnDeclaration = toCTypeDeclaration(function.returnType())
-
-    argsDeclaration = string.join([toCTypeDeclaration(function.args()[ix].type)+" __arg"+str(ix) for ix in range(len(function.args()))], ", ")
-
-    exceptionDeclaration = string.join([toCTypeDeclaration(exception.type) for exception in function.exceptions()], ", ")
-
-    if len(exceptionDeclaration)> 0:
-	exceptionDeclaration = "throw("+exceptionDeclaration+")"
-
-    argsStructDeclaration = toCTypeDeclaration(function.argsStruct)+" __args"
-
-    argsStructWriter = toWriterCall("__args", function.argsStruct, "_oprot", "_otrans")
-
-    argsToStruct= string.join(["    __args."+function.args()[ix].name+" = __arg"+str(ix) for ix in range(len(function.args()))], ";\n")
-    
-    resultStructDeclaration = toCTypeDeclaration(function.resultStruct)+" __result"
-
-    resultStructReader = toReaderCall("__result", function.resultStruct, "_iprot", "_itrans")
-
-    exceptions = function.exceptions()
-
-    """ void return and non-void returns require very different arrangments.  For void returns, we don't actually expect
-        anything to have been sent from the remote side, therefore  we need to check for explicit exception returns first,
-	then, if none were encountered, return.  For void we test for success first - since this is the most likey result -
-	and then check for exceptions.  In both cases, we need to handle the case where there are no specified exceptions. """
-
-    if len(exceptions) > 0:
-	errors= ["if(__result.__isset."+exception.name+") {\n        throw  __result."+exception.name+";\n    }" for exception in exceptions]
-    else:
-	errors = []
-
-    if not isVoid:
-	returnResult = "    if(__result.__isset.success) {\n        return __result.success;\n}"
-	if len(errors) > 0:
-	    returnResult+= " else "+string.join(errors, " else ")
-    else:
-	if len(errors) > 0:
-	    returnResult= "    "+string.join(errors, " else ")+" else {\n        return;\n    }\n"
-	else:
-	    returnResult="    return;\n"
-	    
-    return CPP_CLIENT_FUNCTION_DEFINITION.substitute(service=servicePrefix,
-						     function=function.name,
-						     returnDeclaration=returnDeclaration,
-						     argsDeclaration=argsDeclaration,
-						     exceptionDeclaration=exceptionDeclaration,
-						     argsStructDeclaration=argsStructDeclaration,
-						     argsStructWriter=argsStructWriter,
-						     argsToStruct=argsToStruct,
-						     resultStructDeclaration=resultStructDeclaration, 
-						     resultStructReader=resultStructReader,
-						     returnResult=returnResult)
-
-def toClientServiceDefinition(service, debugp=None):
-    """Converts a thrift service definition to a client stub implementation"""
-
-    result = ""
-
-    for function in service.functionList:
-
-	result+= toClientFunctionDefinition(service.name, function)
-
-    return result
-
-def toClientDefinition(program, debugp=None):
-    """Converts all services in a thrift program to client stub implementations"""
-
-    return string.join([toClientServiceDefinition(service) for service in program.serviceMap.values()], "\n")
-
-def toServiceDeclaration(service, debugp=None):
-    """Converts all services in a thrift program to service interface or abstract base class declarations"""
-
-    return toServiceInterfaceDeclaration(service, debugp) + toServerDeclaration(service, debugp) + toClientDeclaration(service, debugp)
-
-def toGenDir(filename, suffix="gen-cpp", debugp=None):
-    """creates a generated-code subdirectory for C++ code based on filename of thrift source file and optional suffix"""
-
-    result = os.path.join(os.path.split(filename)[0], suffix)
-
-    if not os.path.exists(result):
-        os.mkdir(result)
-
-    return result
-
-def toBasename(filename, debugp=None):
-    """ Take the filename minus the path and\".thrift\" extension  if present """
-
-    basename = os.path.split(filename)[1]
-
-    tokens = os.path.splitext(basename)
-
-    if tokens[1].lower() == ".thrift":
-        basename = tokens[0]
-
-    if debugp:
-        debugp("toBasename("+str(filename)+") => "+str(basename))
-
-    return basename
-
-def toDefinitionHeaderName(filename, genDir=None, debugp=None):
-    """Creates a file name for the public thrift data types based on filename of thrift source file and optional suffix"""
-
-    if not genDir:
-        genDir = toGenDir(filename)
-
-    basename = toBasename(filename)
-
-    result = os.path.join(genDir, basename+"_types.h")
-
-    if debugp:
-        debugp("toDefinitionHeaderName("+str(filename)+", "+str(genDir)+") => "+str(basename))
-
-    return result
-
-def writeDefinitionHeader(program, filename, genDir=None, debugp=None):
-    """Writes public thrift data types defined in program into a public data types header file.  Uses the name of the original
-thrift source, filename, and the optional generated C++ code directory, genDir, to determine the name and location of header file"""
-
-    definitionHeader = toDefinitionHeaderName(filename, genDir)
-
-    if debugp:
-        debugp("definitionHeader: "+str(definitionHeader))
-
-    cfile = CFile(definitionHeader, "w")
-
-    basename = toBasename(filename)
-
-    cfile.writeln(CPP_TYPES_HEADER.substitute(source=basename, date=time.ctime(), namespacePrefix=toCNamespacePrefix(program.namespace)))
-
-    cfile.write(toDefinitions(program.definitions))
-
-    cfile.writeln(CPP_TYPES_FOOTER.substitute(source=basename, namespaceSuffix=toCNamespaceSuffix(program.namespace)))
-
-    cfile.close()
-
-def toServicesHeaderName(filename, genDir=None, debugp=None):
-    """Creates a file name for the public thrift services based on filename of thrift source file and optional suffix"""
-
-    if not genDir:
-        genDir = toGenDir(filename)
-
-    basename = toBasename(filename)
-
-    result = os.path.join(genDir, basename+".h")
-
-    if debugp:
-        debugp("toDefinitionHeaderName("+str(filename)+", "+str(genDir)+") => "+str(basename))
-
-    return result
-
-def writeServicesHeader(program, filename, genDir=None, debugp=None):
-    """Writes public thrift service abstract base class, client class, and server class for all services defined in program into a public services header file.  Uses the name of the original thrift source, filename, and the optional generated C++ code directory, genDir, to determine the name and location of header file"""
-
-    servicesHeader = toServicesHeaderName(filename, genDir)
-
-    if debugp:
-        debugp("servicesHeader: "+str(servicesHeader))
-
-    cfile = CFile(servicesHeader, "w")
-
-    basename = toBasename(filename)
-
-    cfile.writeln(CPP_SERVICES_HEADER.substitute(source=basename, date=time.ctime(), namespacePrefix=toCNamespacePrefix(program.namespace)))
-
-    services = []
-
-    # Build orderered list of service definitions by scanning definitions list for services
-
-    for definition in  program.definitions:
-        if isinstance(definition, Service) and definition.name in program.serviceMap:
-            services.append(definition)
-
-    for service in services:
-
-        cfile.write(toServiceDeclaration(service))
-
-    cfile.writeln(CPP_SERVICES_FOOTER.substitute(source=basename, namespaceSuffix=toCNamespaceSuffix(program.namespace)))
-
-    cfile.close()
-
-
-CPP_STRUCT_READ = Template("""
-uint32_t read${name}Struct("""+CPP_PROTOCOLP+""" _iprot, """+CPP_TRANSPORTP+""" itrans, ${declaration}& value) {
-
-    std::string name;
-    uint32_t id;
-    uint32_t type;
-    uint32_t xfer = 0;
-
-    while(true) {
-        xfer+= _iprot->readFieldBegin(_itrans, name, type, id);
-        if(type == """+CPP_PROTOCOL_TSTOP+""") {
-            break;
-        }
-        switch(id) {
-${readFieldListSwitch}
-        }
-    }
-
-    xfer+= _iprot->readStructEnd(_itrans);
-
-    return xfer;
-}
-""")
-
-CPP_PRIMITIVE_TYPE_IO_METHOD_SUFFIX_MAP = {
-    "void" :"Void",
-    "bool" : "Bool",
-    "string": "String",
-    "utf7": "String",
-    "utf8": "String", 
-    "utf16": "String",
-    "i08": "Byte",
-    "i16": "I16",
-    "i32": "I32", 
-    "i64": "I64", 
-    "u08": "Byte",
-    "u16": "U16",
-    "u32": "U32",
-    "u64": "U64",
-    "float": "Float",
-    "double": "Double"
-}
-
-CPP_COLLECTION_TYPE_IO_METHOD_SUFFIX_MAP = {
-    MapType : "map",
-    ListType : "list",
-    SetType : "set"
-}
-
-def typeToIOMethodSuffix(ttype):
-    """Converts type to a name suitable as a suffix with TProtocol primitive read and write methods or with a generated read or write
-method for a complex type"""
-
-    if isinstance(ttype, PrimitiveType):
-        return CPP_PRIMITIVE_TYPE_IO_METHOD_SUFFIX_MAP[ttype.name]
-
-    elif isinstance(ttype, CollectionType):
-
-        result = CPP_COLLECTION_TYPE_IO_METHOD_SUFFIX_MAP[type(ttype)]+"_"
-
-        if isinstance(ttype, MapType):
-            result+= "k_"+typeToIOMethodSuffix(ttype.keyType)+"_"
-
-        result += "v_"+typeToIOMethodSuffix(ttype.valueType)
-
-        return result
-
-    elif isinstance(ttype, StructType):
-        return "struct_"+ttype.name
-
-    elif isinstance(ttype, TypedefType):
-        return ttype.name
-
-    elif isinstance(ttype, EnumType):
-        return ttype.name
-
-    else:
-        raise Exception, "Unknown type "+str(ttype)
-
-def toReaderCall(value, ttype, reader="iprot", transport="itrans"):
-    """Converts type to a name suitable as a suffix with TProtocol primitive read methods or with a generated read 
-method for a complex type"""
-
-    suffix = typeToIOMethodSuffix(ttype)
-
-    if isinstance(ttype, PrimitiveType):
-	if ttype != VOID_TYPE:
-	    return "xfer += "+reader+"->read"+suffix+"("+transport+", "+value+")"
-	else:
-	    return ""
-
-    elif isinstance(ttype, CollectionType):
-        return "xfer+= read_"+suffix+"("+reader+", "+transport+", "+value+")"
-
-    elif isinstance(ttype, StructType):
-        return "xfer+= read_"+suffix+"("+reader+", "+transport+", "+value+")"
-
-    elif isinstance(ttype, TypedefType):
-        return toReaderCall("reinterpret_cast<"+toCTypeDeclaration(ttype.definitionType)+"&>("+value+")", ttype.definitionType, reader)
-
-    elif isinstance(ttype, EnumType):
-        return toReaderCall("reinterpret_cast<"+toCTypeDeclaration(I32_TYPE)+"&>("+value+")", I32_TYPE, reader)
-
-    else:
-        raise Exception, "Unknown type "+str(ttype)
-
-def toWriterCall(value, ttype, writer="oprot", transport="otrans"):
-    """Converts type to a name suitable as a suffix with TProtocol primitive write methods or with a generated write 
-method for a complex type"""
-
-    suffix = typeToIOMethodSuffix(ttype)
-
-    if isinstance(ttype, PrimitiveType):
-	if ttype != VOID_TYPE:
-	    return "xfer+= "+writer+"->write"+suffix+"("+transport+", "+value+")"
-	else:
-	    return ""
-
-    elif isinstance(ttype, CollectionType):
-        return "xfer+= write_"+suffix+"("+writer+", "+transport+", "+value+")"
-
-    elif isinstance(ttype, StructType):
-        return "xfer+= write_"+suffix+"("+writer+", "+transport+", "+value+")"
-
-    elif isinstance(ttype, TypedefType):
-        return toWriterCall("reinterpret_cast<const "+toCTypeDeclaration(ttype.definitionType)+"&>("+value+")", ttype.definitionType, writer)
-
-    elif isinstance(ttype, EnumType):
-        return toWriterCall("reinterpret_cast<const "+toCTypeDeclaration(I32_TYPE)+"&>("+value+")", I32_TYPE, writer)
-
-    else:
-        raise Exception, "Unknown type "+str(ttype)
-
-CPP_READ_MAP_DEFINITION = Template("""
-uint32_t read_${suffix}("""+CPP_PROTOCOLP+""" iprot, """+CPP_TRANSPORTP+""" itrans, ${declaration}& value) {
-
-   uint32_t count;
-   ${keyType} key;
-   ${valueType} elem;
-   uint32_t xfer = 0;
-   """+CPP_PROTOCOL_TTYPE+""" keyType;
-   """+CPP_PROTOCOL_TTYPE+""" valueType;
-
-   xfer += iprot->readMapBegin(itrans, keyType, valueType, count);
-
-   /* XXX
-      Should we assert that read key and value type are correct? */
-   
-   for(uint32_t ix = 0; ix < count; ix++) {
-       ${keyReaderCall};
-       ${valueReaderCall};
-       value.insert(std::make_pair(key, elem));
-   }
-
-   xfer += iprot->readMapEnd(itrans);
-
-   return xfer;
-}
-""")
-    
-CPP_WRITE_MAP_DEFINITION = Template("""
-uint32_t write_${suffix}("""+CPP_PROTOCOLP+""" oprot, """+CPP_TRANSPORTP+""" otrans, const ${declaration}& value) {
-
-   uint32_t xfer = 0;
-
-   xfer += oprot->writeMapBegin(otrans, ${keyWireType}, ${valueWireType}, value.size());
-
-   for(${declaration}::const_iterator ix = value.begin(); ix != value.end(); ++ix) {
-       ${keyWriterCall};
-       ${valueWriterCall};
-   }
-
-   xfer += oprot->writeMapEnd(otrans);
-   return xfer;
-}
-""")
-    
-CPP_READ_LIST_DEFINITION = Template("""
-uint32_t read_${suffix}("""+CPP_PROTOCOLP+""" iprot, """+CPP_TRANSPORTP+""" itrans, ${declaration}& value) {
-
-   uint32_t count;
-   ${valueType} elem;
-   uint32_t xfer = 0;
-   """+CPP_PROTOCOL_TTYPE+""" valueType;
-
-   xfer += iprot->read${protocolSuffix}Begin(itrans, valueType, count);
-
-   /* XXX
-      Should we assert that read value type is correct? */
-
-   xfer+= iprot->readU32(itrans,  count);
-
-   for(uint32_t ix = 0; ix < count; ix++) {
-       ${valueReaderCall};
-       value.${insert}(elem);
-   }
-
-   xfer += iprot->read${protocolSuffix}End(itrans);
-   return xfer;
-}
-""")
-    
-CPP_WRITE_LIST_DEFINITION = Template("""
-uint32_t write_${suffix}("""+CPP_PROTOCOLP+""" oprot, """+CPP_TRANSPORTP+""" otrans, const ${declaration}& value) {
-
-   uint32_t xfer = 0;
-
-   xfer+= oprot->write${protocolSuffix}Begin(otrans, ${valueWireType}, value.size());
-
-   for(${declaration}::const_iterator ix = value.begin(); ix != value.end(); ++ix) {
-       ${valueWriterCall};
-   }
-
-   xfer+= oprot->write${protocolSuffix}End(otrans);
-
-   return xfer;
-}
-""")
-    
-def toCollectionReaderDefinition(collection):
-    """Converts collection type to reader function definition"""
-
-    suffix = typeToIOMethodSuffix(collection)
-
-    if isinstance(collection, MapType):
-        keyReaderCall = toReaderCall("key", collection.keyType)
-
-    valueReaderCall= toReaderCall("elem", collection.valueType)
-
-    if isinstance(collection, MapType):
-        return CPP_READ_MAP_DEFINITION.substitute(suffix=suffix, declaration=toCTypeDeclaration(collection),
-                                                  keyType=toCTypeDeclaration(collection.keyType),
-                                                  keyReaderCall=keyReaderCall,
-                                                  valueType=toCTypeDeclaration(collection.valueType),
-                                                  valueReaderCall=valueReaderCall)
-
-    else:
-	if isinstance(collection, ListType):
-	    protocolSuffix="List"
-	    insert="push_back"
-	else:
-	    protocolSuffix="Set"
-	    insert="insert"
-
-        return CPP_READ_LIST_DEFINITION.substitute(suffix=suffix, declaration=toCTypeDeclaration(collection),
-						   protocolSuffix=protocolSuffix,
-                                                   valueReaderCall=valueReaderCall,
-                                                   valueType=toCTypeDeclaration(collection.valueType),
-						   insert=insert)
-
-
-def toCollectionWriterDefinition(collection):
-    """Converts collection type to writer function definition"""
-
-    suffix = typeToIOMethodSuffix(collection)
-
-    if isinstance(collection, MapType):
-        keyWriterCall = toWriterCall("ix->first", collection.keyType)
-	keyWireType = toWireType(collection.keyType)
-        valueWriterCall = toWriterCall("ix->second", collection.valueType)
-
-    else:
-	valueWriterCall= toWriterCall("*ix", collection.valueType)
-
-    valueWireType = toWireType(collection.valueType)
-
-    if isinstance(collection, MapType):
-        return CPP_WRITE_MAP_DEFINITION.substitute(suffix=suffix, declaration=toCTypeDeclaration(collection),
-						   keyType=toCTypeDeclaration(collection.keyType),
-						   keyWireType=keyWireType,
-						   keyWriterCall=keyWriterCall,
-						   valueType=toCTypeDeclaration(collection.valueType),
-						   valueWireType=valueWireType,
-						   valueWriterCall=valueWriterCall)
-
-    else:
-	if isinstance(collection, ListType):
-	    protocolSuffix = "List"
-	elif isinstance(collection, SetType):
-	    protocolSuffix = "Set"
-	else:
-	    raise Exception, "Unknown collection type "+str(type(collection))+":"+str(collection)
-	    
-        return CPP_WRITE_LIST_DEFINITION.substitute(suffix=suffix, declaration=toCTypeDeclaration(collection),
-						    protocolSuffix=protocolSuffix,
-						    valueWireType=valueWireType,
-						    valueWriterCall=valueWriterCall,
-						    valueType=toCTypeDeclaration(collection.valueType))
-
-
-CPP_READ_STRUCT_DEFINITION = Template("""
-uint32_t read_${suffix}("""+CPP_PROTOCOLP+""" iprot, """+CPP_TRANSPORTP+""" itrans, ${declaration}& value) {
-
-    std::string name;
-    """+CPP_PROTOCOL_TTYPE+""" type;
-    int16_t id;
-    uint32_t xfer = 0;
-
-    xfer+= iprot->readStructBegin(itrans, name);
-
-    while(true) {
-
-        xfer+= iprot->readFieldBegin(itrans, name, type, id);
-
-        if(type == """+CPP_PROTOCOL_TSTOP+""") {break;}
-
-        switch(id) {
-${fieldSwitch}
-            default: xfer += iprot->skip(itrans, type); break;
-	}
-
-        xfer+= iprot->readFieldEnd(itrans);
-    }
-
-    xfer+= iprot->readStructEnd(itrans);
-
-    return xfer;
-}
-""")
-    
-CPP_WRITE_FIELD_DEFINITION  = Template("""oprot->writeFieldBegin(otrans, \"${name}\", ${type}, ${id}); ${fieldWriterCall}; oprot->writeFieldEnd(otrans)""") 
-
-CPP_WRITE_STRUCT_DEFINITION = Template("""
-uint32_t write_${suffix}("""+CPP_PROTOCOLP+""" oprot, """+CPP_TRANSPORTP+""" otrans, const ${declaration}& value) {
-
-    uint32_t xfer = 0;
-
-    xfer+= oprot->writeStructBegin(otrans, \"${name}\");
-${fieldWriterCalls}
-    xfer+= oprot->writeFieldStop(otrans);
-    xfer += oprot->writeStructEnd(otrans);
-    return xfer;
-}
-""")
-    
-def toStructReaderDefinition(struct):
-    """Converts struct type to reader function definition"""
-
-    suffix = typeToIOMethodSuffix(struct)
-
-    # Sort field list in order of increasing ids
-
-    fieldList = []
-    fieldList+= struct.fieldList
-
-    fieldList.sort(lambda a,b: a.id - b.id)
-
-    fieldSwitch=""
-
-    for field in fieldList:
-	if isVoidType(field.type):
-	    continue;
-        fieldSwitch+= "            case "+str(field.id)+": "
-        fieldSwitch+= toReaderCall("value."+field.name, field.type)+"; value.__isset."+field.name+" = true; break;\n"
-
-    return CPP_READ_STRUCT_DEFINITION.substitute(suffix=suffix, declaration=toCTypeDeclaration(struct), fieldSwitch=fieldSwitch)
-
-
-def toStructWriterDefinition(struct):
-    """Converts struct type to writer function definition"""
-
-    suffix = typeToIOMethodSuffix(struct)
-
-    fieldWriterCalls = []
-
-    fieldWriterCalls = [CPP_WRITE_FIELD_DEFINITION.substitute(name=field.name, 
-							      type=toWireType(toCanonicalType(field.type)),
-							      id=field.id,
-							      fieldWriterCall=toWriterCall("value."+field.name, field.type))+";" 
-			for field in struct.fieldList if not isVoidType(field.type)
-			]
-
-    fieldWriterCalls = "    "+string.join(fieldWriterCalls, "\n    ")
-
-    return CPP_WRITE_STRUCT_DEFINITION.substitute(name=struct.name, suffix=suffix, declaration=toCTypeDeclaration(struct), fieldWriterCalls=fieldWriterCalls)
-    
-CPP_WRITE_RESULT_STRUCT_DEFINITION = Template("""
-uint32_t write_${suffix}("""+CPP_PROTOCOLP+""" oprot, """+CPP_TRANSPORTP+""" otrans, const ${declaration}& value) {
-
-    uint32_t xfer = 0;
-
-    xfer+= oprot->writeStructBegin(otrans, \"${name}\");
-    if(${value}.__isset.x)
-${fieldWriterCalls}
-    xfer+= oprot->writeFieldStop(otrans);
-    xfer += oprot->writeStructEnd(otrans);
-    return xfer;
-}
-""")
-    
-def toResultStructReaderDefinition(struct):
-    """Converts internal results struct to a reader function definition"""
-
-    return toStructReaderDefinition(struct)
-
-def toResultStructWriterDefinition(struct):
-    """Converts internal results struct to a reader function definition.  The difference between this function and toStructWriterDefinition is that this only sends one field, either success or an exception field, depending on which field is set"""
-
-    suffix = typeToIOMethodSuffix(struct)
-
-    fieldWriterCalls = ["if(value.__isset."+field.name+") { "+
-			CPP_WRITE_FIELD_DEFINITION.substitute(name=field.name,
-							      type=toWireType(toCanonicalType(field.type)),
-							      id=field.id,
-							      fieldWriterCall=toWriterCall("value."+field.name, field.type))+";}" 
-			for field in struct.fieldList if not isVoidType(field.type)]
-
-    fieldWriterCalls = "    "+string.join(fieldWriterCalls, "\n    else ")
-
-    return CPP_WRITE_STRUCT_DEFINITION.substitute(name=struct.name, suffix=suffix, declaration=toCTypeDeclaration(struct), fieldWriterCalls=fieldWriterCalls)
-
-def toReaderDefinition(ttype):
-    """Converts thrift type to a reader function definition"""
-
-    if isinstance(ttype, CollectionType):
-        return toCollectionReaderDefinition(ttype)
-
-    elif isinstance(ttype, StructType):
-        return toStructReaderDefinition(ttype)
-
-    elif isinstance(ttype, TypedefType):
-	return ""
-
-    elif isinstance(ttype, EnumType):
-	return ""
-
-    else:
-	raise Exception, "Unsupported type: "+str(ttype)
-
-def toWriterDefinition(ttype):
-    """Converts thrift type to a writer function definition"""
-
-    if isinstance(ttype, CollectionType):
-        return toCollectionWriterDefinition(ttype)
-
-    elif isinstance(ttype, StructType):
-        return toStructWriterDefinition(ttype)
-
-    elif isinstance(ttype, TypedefType):
-	return ""
-
-    elif isinstance(ttype, EnumType):
-	return ""
-
-    else:
-	raise Exception, "Unsupported type: "+str(ttype)
-
-def toOrderedIOList(ttype, result=None):
-    """Builds a list of types ordered by doing a depth first traverse of all thrift type definitions.  This gives us a list from which we can 
-generate read/write methods without making forward references."""
-
-    if not result:
-	result = []
-
-    if ttype in result:
-	return result
-
-    elif isinstance(ttype, PrimitiveType):
-	return result
-
-    elif isinstance(ttype, CollectionType):
-
-	if isinstance(ttype, MapType):
-	    result = toOrderedIOList(ttype.keyType, result)
-
-	result = toOrderedIOList(ttype.valueType, result)
-
-	result.append(ttype)
-
-    elif isinstance(ttype, StructType):
-	for field in ttype.fieldList:
-	    result = toOrderedIOList(field.type, result)
-	result.append(ttype)
-
-    elif isinstance(ttype, TypedefType):
-	result.append(ttype)
-	return result
-
-    elif isinstance(ttype, EnumType):
-	result.append(ttype)
-	return result
-
-    elif isinstance(ttype, Program):
-
-	for struct in ttype.structMap.values():
-	    result = toOrderedIOList(struct, result)
-
-	for service in ttype.serviceMap.values():
-	    result = toOrderedIOList(service, result)
-
-    elif isinstance(ttype, Service):
-	for function in ttype.functionList:
-	    result = toOrderedIOList(function, result)
-
-    elif isinstance(ttype, Function):
-	result = toOrderedIOList(ttype.returnType(), result)
-
-	# skip the args struct itself and just order the arguments themselves
-	# we don't want the arg struct to be referred to until later, since we need to
-	# inline those struct definitions with the implementation, not in the types header
-	
-	for field in ttype.args():
-	    result = toOrderedIOList(field.type, result)
-
-    else:
-	raise Exception, "Unsupported thrift type: "+str(ttype)
-
-    return result
-
-def toIOMethodImplementations(program):
-    """Generates read and write methods for all non-primitive types in a thrift program as well as for the internal argStruct and resultStruct types for 
-all service functions"""
-    
-    # get ordered list of all types that need marshallers:
-
-    iolist = toOrderedIOList(program)
-
-    result = ""
-
-    for ttype in iolist:
-	result+= toReaderDefinition(ttype)
-	result+= toWriterDefinition(ttype)
-
-    # For all function argument lists, we need to create both struct definitions
-    # and io methods.  We keep the struct definitions local, since they aren't part of the service API
-    #
-    # Note that we don't need to do a depth-first traverse of arg structs since they can only include fields
-    # we've already seen
-
-    for service in program.serviceMap.values():
-	for function in service.functionList:
-	    result+= toStructDefinition(function.argsStruct)
-	    result+= toReaderDefinition(function.argsStruct)
-	    result+= toWriterDefinition(function.argsStruct)
-	    result+= toStructDefinition(function.resultStruct)
-	    result+= toResultStructReaderDefinition(function.resultStruct)
-	    result+= toResultStructWriterDefinition(function.resultStruct)
-
-    return result;
-
-def toImplementationSourceName(filename, genDir=None, debugp=None):
-    """Creates a file name for the implementation of client stubs, server skeletons, and non-primitive read/write methods."""
-
-    if not genDir:
-        genDir = toGenDir(filename)
-
-    basename = toBasename(filename)
-
-    result = os.path.join(genDir, basename+".cc")
-
-    if debugp:
-        debugp("toDefinitionHeaderName("+str(filename)+", "+str(genDir)+") => "+str(basename))
-
-    return result
-
-def writeImplementationSource(program, filename, genDir=None, debugp=None):
-    """Writes client stub, server skeleton, and non-primitive type I/O functions for all servciesf defined in program into a C/C++ source file.  Uses the name of the original
-thrift source, filename, and the optional generated C++ code directory, genDir, to determine the name and location of header file"""
-
-    implementationSource = toImplementationSourceName(filename, genDir)
-
-    if debugp:
-        debugp("implementationSource: "+str(implementationSource))
-
-    cfile = CFile(implementationSource, "w")
-
-    basename = toBasename(filename)
-
-    cfile.writeln(CPP_IMPL_HEADER.substitute(source=basename, date=time.ctime(), namespacePrefix=toCNamespacePrefix(program.namespace)))
-
-    cfile.write(toIOMethodImplementations(program))
-
-    cfile.write(toServerDefinition(program))
-
-    cfile.write(toClientDefinition(program))
-
-    cfile.writeln(CPP_IMPL_FOOTER.substitute(source=basename, namespaceSuffix=toCNamespaceSuffix(program.namespace)))
-
-    cfile.close()
-
-class CPPGenerator(Generator):
-
-    def __call__(self, program, filename, genDir=None, debugp=None):
-
-        writeDefinitionHeader(program, filename, genDir, debugp)
-        
-        writeServicesHeader(program, filename, genDir, debugp)
-        
-        writeImplementationSource(program, filename, genDir, debugp)
diff --git a/compiler/py/src/generator.py b/compiler/py/src/generator.py
deleted file mode 100644
index 7e8a84a..0000000
--- a/compiler/py/src/generator.py
+++ /dev/null
@@ -1,3 +0,0 @@
-class Generator(object):
-    def __call__(self,  program, filename, gendir, debugp=None):
-        raise Exception, "Not implemented"
diff --git a/compiler/py/src/parser.py b/compiler/py/src/parser.py
deleted file mode 100644
index 87633f4..0000000
--- a/compiler/py/src/parser.py
+++ /dev/null
@@ -1,1055 +0,0 @@
-#!python
-""" Thrift IDL parser/compiler
-    
-    This parser uses the Python PLY LALR parser generator to build a parser for the Thrift IDL grammar.
-
-    If a compiles \"thyc\" file exists for a given source \"thrift\" file it computes a hash of the file and determines
-    if if it is the source of the \"thyc\" file.  If  so, it simply returns the parse tree previously computed, otherwise it
-    parses the source and generates a new \"thyc\" file  (assuming of course the source file contains no errors.)
-
-    When the parser encounters import statements it searches for corresponding \"thrift\" or \"thyc\" files in paths corresponding to
-    the specified namespace.
-
-    Author(s): Mark Slee(mclee@facebook.com), Marc Kwiatkowski (marc@facebook.com)
-
-    $Id:
-"""
-
-import lex
-import os
-import pickle
-import string
-import yacc
-
-class Error(object):
-
-    def __init__(self, start=0, end=0, message=""):
-	if len(message) == 0:
-	    raise Exception, "NO MESSAGE"
-	self.message = message
-	self.start = start
-	self.end = end
-    
-    def __str__(self):
-	return str(self.start)+": error: "+self.message
-
-class SyntaxError(Error):
-    def __init__(self, yaccSymbol):
-	if isinstance(yaccSymbol, yacc.YaccSymbol):
-	    Error.__init__(self, yaccSymbol.lineno, yaccSymbol.lineno, "syntax error "+str(yaccSymbol.value))
-	else:
-	    Error.__init__(self, 1, 1, "syntax error "+str(yaccSymbol))
-
-class SymanticsError(Error):
-
-    def __init__(self, definition, message):
-	Error.__init__(self, definition.start, definition.end, message)
-	self.definition = definition
-
-    def __str__(self):
-	return str(self.start)+": error: "+self.message
-
-class ErrorException(Exception):
-    def __init__(self, errors=None):
-	Exception.__init__(self)
-	self.errors = errors
-
-class Definition(object):
-    """ Abstract thrift IDL definition unit """
-
-    def __init__(self, symbols=None, name="", id=None):
-	if symbols:
-	    self.lines(symbols)
-	self.name = name
-	self.id = id
-
-    def validate(self):
-	pass
-
-    def lines(self, symbols):
-	self.start = symbols.lineno(1)
-	self.end = symbols.lineno(len(symbols) - 1)
-
-class Identifier(Definition):
-    """ An Identifier - name and optional integer id """
-
-    def __init__(self, symbols, name, id=None):
-	Definition.__init__(self, symbols, name, id)
-
-    def __str__(self):
-	result = self.name
-	if self.id != 0:
-	    result+="="+str(self.id)
-	return result
-
-def toCanonicalType(ttype):
-    if isinstance(ttype, TypedefType):
-	return toCanonicalType(ttype.definitionType)
-    else:
-	return ttype
-
-def isVoidType(ttype):
-    """Is canonnical type of the specified type void?"""
-    return toCanonicalType(ttype) == VOID_TYPE
-
-def isComparableType(ttype):
-    """Is the type one that is implicitly comparable and thus is suitable for use in C++ maps and sets and java Sets and Maps?"""
-    ttype = toCanonicalType(ttype)
-    return isinstance(ttype, PrimitiveType) or isinstance(ttype, EnumType)
-
-class Type(Definition):
-    """ Abstract Type definition """
-
-    def __init__(self, symbols, name):
-	Definition.__init__(self, symbols, name)
-	self.name = name
-
-    def __str__(self):
-	return self.name
-
-class TypedefType(Type):
-
-    def __init__(self, symbols, name, definitionType):
-	Type.__init__(self, symbols, name)
-	self.definitionType = definitionType
-
-    def __str__(self):
-	return self.name+"<"+str(self.name)+", "+str(self.definitionType)+">"
-
-""" Primitive Types """
-
-class PrimitiveType(Type):
-
-    def __init__(self, name):
-	Type.__init__(self, None, name)
-
-STOP_TYPE =  PrimitiveType("stop")
-VOID_TYPE =  PrimitiveType("void")
-BOOL_TYPE = PrimitiveType("bool")
-STRING_TYPE = PrimitiveType("utf7")
-UTF7_TYPE = STRING_TYPE
-UTF8_TYPE = PrimitiveType("utf8")
-UTF16_TYPE = PrimitiveType("utf16")
-BYTE_TYPE = PrimitiveType("u08")
-I08_TYPE = PrimitiveType("i08")
-I16_TYPE = PrimitiveType("i16")
-I32_TYPE = PrimitiveType("i32")
-I64_TYPE = PrimitiveType("i64")
-U08_TYPE = PrimitiveType("u08")
-U16_TYPE = PrimitiveType("u16")
-U32_TYPE = PrimitiveType("u32")
-U64_TYPE = PrimitiveType("u64")
-FLOAT_TYPE = PrimitiveType("float")
-DOUBLE_TYPE = PrimitiveType("double")
-
-PRIMITIVE_MAP = {
-    "stop" : STOP_TYPE,
-    "void" : VOID_TYPE,
-    "bool" : BOOL_TYPE,
-    "string": UTF7_TYPE,
-    "utf7": UTF7_TYPE,
-    "utf8": UTF8_TYPE,
-    "utf16": UTF16_TYPE,
-    "byte" : U08_TYPE,
-    "i08": I08_TYPE,
-    "i16": I16_TYPE,
-    "i32": I32_TYPE,
-    "i64": I64_TYPE,
-    "u08": U08_TYPE,
-    "u16": U16_TYPE,
-    "u32": U32_TYPE,
-    "u64": U64_TYPE,
-    "float": FLOAT_TYPE,
-    "double": DOUBLE_TYPE
-}
-
-""" Collection Types """
-
-class CollectionType(Type):
-
-    def __init__(self, symbols, name):
-	Type.__init__(self, symbols, name)
-
-    def validate(self):
-	return True
-
-class MapType(CollectionType):
-
-    def __init__(self, symbols, keyType, valueType):
-	CollectionType.__init__(self, symbols, "map<"+keyType.name+","+valueType.name +">")
-	self.keyType = keyType
-	self.valueType = valueType
-
-    def validate(self):
-	if not isComparableType(self.keyType):
-	    raise ErrorException([SymanticsError(self, "key type \""+str(self.keyType)+"\" is not a comparable type.")])
-
-class SetType(CollectionType):
-
-    def __init__(self, symbols, valueType):
-	CollectionType.__init__(self, symbols, "set<"+valueType.name+">")
-	self.valueType = valueType
-
-    def validate(self):
-	if not isComparableType(self.valueType):
-	    raise ErrorException([SymanticsError(self, "value type \""+str(self.valueType)+"\" is not a comparable type.")])
-
-class ListType(CollectionType):
-
-    def __init__(self, symbols, valueType):
-	CollectionType.__init__(self, symbols, "list<"+valueType.name+">")
-	self.valueType = valueType
-
-class EnumType(Definition):
-
-    def __init__(self, symbols, name, enumDefs):
-	Definition.__init__(self, symbols, name)
-	self.enumDefs = enumDefs
-
-    def validate(self):
-	ids = {}
-	names = {}
-	errors = []
-
-	for enumDef in self.enumDefs:
-
-	    if enumDef.name in names:
- 		errors.append(SymanticsError(enumDef, self.name+"."+str(enumDef.name)+" already defined at line "+str(names[enumDef.name].start)))
-	    else:
-		names[enumDef.name] = enumDef
-
-	    if enumDef.id != None:
-		oldEnumDef = ids.get(enumDef.id)
-		if oldEnumDef:
-		    errors.append(SymanticsError(enumDef, "enum "+self.name+" \""+str(enumDef.name)+"\" uses constant already assigned to \""+oldEnumDef.name+"\""))
-		else:
-		    ids[enumDef.id] = enumDef
-	
-	if len(errors):
-	    raise ErrorException(errors)
-
-	def assignId(enumDef, currentId, ids):
-	    'Finds the next available id number for an enum definition'
-
-	    eid= currentId + 1
-
-	    while eid in ids:
-		eid += 1
-	    
-	    enumDef.id = eid
-
-	    ids[enumDef.id] = enumDef
-	    
-	    return eid
-
-	# assign ids for all enum defs with unspecified ids
-	
-	currentId = 0
-	
-	for enumDef in self.enumDefs:
-	    if not enumDef.id:
-		assignId(enumDef, currentId, ids)
-		currentId = enumDef.id
-
-    def __repr__(self):
-	return str(self)
-	
-    def __str__(self):
-	return self.name+"<"+string.join(map(lambda enumDef: str(enumDef), self.enumDefs), ", ")
-
-class EnumDef(Definition):
-
-    def __init__(self, symbols, name, id=None):
-	Definition.__init__(self, symbols, name, id)
-
-    def __repr__(self):
-	return str(self)
-
-    def __str__(self):
-	result = self.name
-	if self.id:
-	    result+= ":"+str(self.id)
-	return result
-
-
-class Field(Definition):
-
-    def __init__(self, symbols, type, identifier):
-	Definition.__init__(self, symbols, identifier.name, identifier.id)
-	self.type = type
-	self.identifier = identifier
-
-    def __str__(self):
-	return "<"+str(self.type)+", "+str(self.identifier)+">"
-
-def validateFieldList(fieldList):
-
-    errors = []
-    names = {}
-    ids = {}
-
-    for field in fieldList:
-
-	if field.name in names:
-	    oldField = names[field.name]
-	    errors.append(SymanticsError(field, "field \""+field.name+"\" already defined at "+str(oldField.start)))
-	else:
-	    names[field.name] = field
-
-	if field.id != None:
-	    oldField = ids.get(field.id)
-	    if oldField:
-		errors.append(SymanticsError(field, "field \""+field.name+"\" uses constant already assigned to \""+oldField.name+"\""))
-	    else:
-		ids[field.id] = field
-	
-    if len(errors):
-	raise ErrorException(errors)
-
-    def assignId(field, currentId, ids):
-	'Finds the next available id number for a field'
-	fid = currentId - 1
-
-	while fid in ids:
-	    fid-= 1
-	    
-	field.id = fid
-
-	ids[field.id] = field
-	
-	return fid
-
-    # assign ids for all fields with unspecified ids
-	
-    currentId = 0
-	
-    for field in fieldList:
-	if not field.id:
-	    currentId = assignId(field, currentId, ids)
-	
-class StructType(Type):
-
-    def __init__(self, symbols, name, fieldList):
-	Type.__init__(self, symbols, name)
-	self.fieldList = fieldList
-
-    def validate(self):
-	validateFieldList(self.fieldList)
-
-    def __str__(self):
-	return self.name+"<"+string.join(map(lambda a: str(a), self.fieldList), ", ")+">"
-
-class ExceptionType(StructType):
-
-    def __init__(self, symbols, name, fieldList):
-	StructType.__init__(self, symbols, name, fieldList)
-
-class Function(Definition):
-
-    def __init__(self, symbols, name, resultStruct, argsStruct):
-	Definition.__init__(self, symbols, name)
-	self.resultStruct = resultStruct
-	self.argsStruct = argsStruct
-
-    def validate(self):
-	validateFieldList(self.argsStruct.fieldList)
-	validateFieldList(self.resultStruct.fieldList)
-
-    def args(self):
-	return self.argsStruct.fieldList
-
-    def returnType(self):
-	return self.resultStruct.fieldList[0].type
-
-    def exceptions(self):
-	return self.resultStruct.fieldList[1:]
-    
-    def __str__(self):
-	return self.name+"("+str(self.argsStruct)+") => "+str(self.resultStruct)
-
-class Service(Definition):
-
-    def __init__(self, symbols, name, functionList):
-	Definition.__init__(self, symbols, name)
-	self.functionList = functionList
-
-    def validate(self):
-
-	errors = []
-	functionNames = {}
-	for function in self.functionList:
-	    if function.name in functionNames:
-		oldFunction = functionNames[function.name]
-		errors.append(SymanticsError(function, "function "+function.name+" already defined at "+str(oldFunction.start)))
-	
-	if len(errors):
-	    raise ErrorException(errors)
-
-    def __str__(self):
-	return self.name+"("+string.join(map(lambda a: str(a), self.functionList), ", ")+")"
-
-class Program(object):
-
-    def __init__(self, symbols=None, name="",
-		 namespace="",
-		 definitions=None, 
-		 serviceMap=None, 
-		 typedefMap=None, 
-		 enumMap=None, structMap=None, 
-		 collectionMap=None,
-                 primitiveMap=None):
-
-	self.name = name
-
-	self.namespace = namespace
-
-        if not definitions:
-            definitions = []
-        self.definitions = definitions
-
-	if not serviceMap:
-	    serviceMap = {}
-	self.serviceMap = serviceMap
-
-	if not typedefMap:
-	    typedefMap = {}
-	self.typedefMap = typedefMap
-
-	if not enumMap:
-	    enumMap = {}
-	self.enumMap = enumMap
-
-	if not structMap:
-	    structMap = {}
-	self.structMap = structMap
-
-	if not collectionMap:
-	    collectionMap = {}
-	self.collectionMap = collectionMap
-
-	if not primitiveMap:
-	    primitiveMap = PRIMITIVE_MAP
-	self.primitiveMap = primitiveMap
-
-    def addDefinition(self, definition, definitionMap, definitionTypeName):
-	
-	oldDefinition = definitionMap.get(definition.name)
-	if oldDefinition:
-	    raise ErrorException([SymanticsError(definition, definitionTypeName+" "+definition.name+" is already defined at "+str(oldDefinition.start))])
-	else:
-	    definitionMap[definition.name] = definition
-
-        # keep an ordered list of definitions so that stub/skel generators can determine the original order
-
-        self.definitions.append(definition)
-
-    def addStruct(self, struct):
-	self.addDefinition(struct, self.structMap, "struct")
-
-    def addTypedef(self, typedef):
-	self.addDefinition(typedef, self.typedefMap, "typedef")
-	
-    def addEnum(self, enum):
-	self.addDefinition(enum, self.enumMap, "enum")
-
-    def addService(self, service):
-	self.addDefinition(service, self.serviceMap, "service")
-
-    def addCollection(self, collection):
-	if collection.name in self.collectionMap:
-	    return self.collectionMap[collection.name]
-	else:
-	    self.collectionMap[collection.name] = collection
-	    return collection
-
-    def getType(self, parent, symbol):
-	""" Get the type definition for a symbol"""
-	
-	typeName = None
-
-	if isinstance(symbol, Type):
-	    return symbol
-	elif isinstance(symbol, Field):
-	    typeName = symbol.type.name
-	elif isinstance(symbol, Identifier):
-	    typeName = symbol.name
-	else:
-	    raise ErrorException([SymanticsError(parent, "unknown symbol \""+str(symbol)+"\"")])
-
-	for tmap in (self.primitiveMap, self.collectionMap, self.typedefMap, self.enumMap, self.structMap):
-	    if typeName in tmap:
-		return tmap[typeName]
-
-	raise ErrorException([SymanticsError(parent, "\""+typeName+"\"  is not defined.")])
-
-    def hasType(self, parent, symbol):
-	""" Determine if a type definition exists for the symbol"""
-
-        return self.getType(parent, symbol) != None
-
-    def validate(self):
-
-	errors = []
-
-        # Verify that struct fields types, collection key and element types, and typedef defined types exists and replaces
-        # type names with references to the type objects
-
-	for struct in self.structMap.values():
-	    for field in struct.fieldList:
-		try:
-		    field.type = self.getType(struct, field)
-		except ErrorException, e:
-		    errors+= e.errors
-
-	for collection in self.collectionMap.values():
-            try:
-                if isinstance(collection, MapType):
-                    collection.keyType = self.getType(collection, collection.keyType)
-
-                collection.valueType = self.getType(collection, collection.valueType)
-		
-		collection.validate()
-            
-            except ErrorException, e:
-                errors+= e.errors
-
-	for typedef in self.typedefMap.values():
-            try:
-                typedef.definitionType = self.getType(self, typedef.definitionType)
-            
-            except ErrorException, e:
-                errors+= e.errors
-
-        # Verify that service function result and arg list types exist and replace type name with reference to definition
-
-	for service in self.serviceMap.values():
-
-	    for function in service.functionList:
-
-		for field in function.resultStruct.fieldList:
-		    try:
-			field.type = self.getType(function, field)
-		    except ErrorException, e:
-			errors+= e.errors
-
-		for field in function.argsStruct.fieldList:
-		    try:
-			field.type = self.getType(function, field)
-		    except ErrorException, e:
-			errors+= e.errors
-
-	if len(errors):
-	    raise ErrorException(errors)
-
-    def validateNamespace(self,  namespace):
-
-	if self.namespace != "":
-	    raise ErrorException([SymanticsError, self, "namespace already defined as \""+self.namespace+"\""])
-	self.namespace = namespace
-
-class Parser(object):
-    
-    reserved = ("BYTE",
-                # "CONST",
-		"DOUBLE",
-		"ENUM", 
-                "EXCEPTION",
-                # "EXTENDS",
-		"I08",
-		"I16",
-		"I32", 
-		"I64",
-		"LIST", 
-		"MAP",
-		"NAMESPACE",
-		"SERVICE", 
-		"SET",
-                # "STATIC",
-		"STRING",
-		"STRUCT", 
-                # "SYNCHRONIZED",
-		"THROWS",
-		"TYPEDEF",
-		"U08", 
-		"U16",
-		"U32", 
-		"U64", 
-		"UTF16",
-		"UTF8",
-		"VOID"
-                )
-
-    tokens = reserved + (
-	# Literals (identifier, integer constant, float constant, string constant, char const)
-	'ID', 'ICONST', # 'SCONST', 'FCONST', 
-	# Operators default=, optional*, variable...
-	'ASSIGN',  #'OPTIONAL', 'ELLIPSIS',
-	# Delimeters ( ) { } < > , . ; :
-	'LPAREN', 'RPAREN',
-	'LBRACE', 'RBRACE',
-	'LANGLE', 'RANGLE',
-	'COMMA', 'PERIOD' #, 'SEMI' , 'COLON'
-	)
-
-    precendence = ()
-
-    reserved_map = {}
-
-    for r in reserved:
-	reserved_map[r.lower()] = r
-
-    def t_ID(self, t):
-	r'[A-Za-z_][\w_]*'
-	t.type = self.reserved_map.get(t.value,"ID")
-	return t
-    
-    # Completely ignored characters
-    t_ignore           = ' \t\x0c'
-    
-#    t_OPTIONAL         = r'\*'
-    t_ASSIGN           = r'='
-	
-    # Delimeters
-    t_LPAREN           = r'\('
-    t_RPAREN           = r'\)'
-    t_LANGLE           = r'\<'
-    t_RANGLE           = r'\>'
-    t_LBRACE           = r'\{'
-    t_RBRACE           = r'\}'
-    t_COMMA            = r','
-    t_PERIOD           = r'\.'
-#    t_SEMI             = r';'
-#    t_COLON            = r':'
-#    t_ELLIPSIS         = r'\.\.\.'
-    
-    # Integer literal
-    t_ICONST = r'\d+([uU]|[lL]|[uU][lL]|[lL][uU])?'
-
-    # Floating literal
-#    t_FCONST = r'((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?'
-
-    # String literal
-#    t_SCONST = r'\"([^\\\n]|(\\.))*?\"'
-
-    # Comments
-    def t_comment(self, t):
-	r'(?:/\*(.|\n)*?\*/)|(?://[^\n]*\n)'
-	t.lineno += t.value.count('\n')
-	    
-    def t_error(self, t):
-	print "Illegal character %s" % repr(t.value[0])
-	t.skip(1)
-
-    # Newlines
-    def t_newline(self, t):
-	r'\n+'
-	t.lineno += t.value.count("\n")
-	
-    def p_program(self, p):
-	'program : definitionlist'
-	pass
-    
-    def p_definitionlist_1(self, p):
-	'definitionlist : definitionlist definition'
-	pass
-
-    def p_definitionlist_2(self, p):
-	'definitionlist :'
-	pass
-    
-    def p_definition_1(self, p):
-	'definition : typedef'
-	self.pdebug("p_definition_1", p)
-	p[0] = p[1]
-	try:
-	    self.program.addTypedef(p[0])
-	except ErrorException, e:
-	    self.errors+= e.errors
-
-    def p_definition_2(self, p):
-	'definition : enum'
-	self.pdebug("p_definition_2", p)
-	p[0] = p[1]
-	try:
-	    self.program.addEnum(p[0])
-	except ErrorException, e:
-	    self.errors+= e.errors
-    
-    def p_definition_3(self, p):
-	'definition : struct'
-	self.pdebug("p_definition_3", p)
-	p[0] = p[1]
-	try:
-	    self.program.addStruct(p[0])
-	except ErrorException, e:
-	    self.errors+= e.errors
-    
-    def p_definition_4(self, p):
-	'definition : service'
-	self.pdebug("p_definition_4", p)
-	p[0] = p[1]
-	try:
-	    self.program.addService(p[0])
-	except ErrorException, e:
-	    self.errors+= e.errors
-
-    def p_definition_5(self, p):
-	'definition : exception'
-	self.pdebug("p_definition_5", p)
-	p[0] = p[1]
-	try:
-	    self.program.addStruct(p[0])
-	except ErrorException, e:
-	    self.errors+= e.errors
-
-    def p_definition_6(self, p):
-	'definition : namespace'
-	self.pdebug("p_definition_6", p)
-	p[0] = p[1]
-
-    def p_typedef(self, p):
-	'typedef : TYPEDEF definitiontype ID'
-	self.pdebug("p_typedef", p)
-	p[0] = TypedefType(p, p[3], p[2])
-	try:
-	    p[0].validate()
-
-	except ErrorException, e:
-	    self.errors+= e.errors
-
-    def p_enum(self, p):
-	'enum : ENUM ID LBRACE enumdeflist RBRACE'
-	self.pdebug("p_enum", p)
-	p[0] = EnumType(p, p[2], p[4])
-
-	try:
-	    p[0].validate()
-	except ErrorException, e:
-	    self.errors+= e.errors
-	
-    def p_enumdeflist_1(self, p):
-	'enumdeflist : enumdeflist COMMA enumdef'
-	self.pdebug("p_enumdeflist_1", p)
-	p[0] = p[1] + (p[3],)
-
-    def p_enumdeflist_2(self, p):
-	'enumdeflist : enumdef' 
-	self.pdebug("p_enumdeflist_2", p)
-	p[0] = (p[1],)
-
-    def p_enumdef_0(self, p):
-	'enumdef : ID ASSIGN ICONST'
-	self.pdebug("p_enumdef_0", p)
-	p[0] = EnumDef(p, p[1], int(p[3]))
-
-    def p_enumdef_1(self, p):
-	'enumdef : ID'
-	self.pdebug("p_enumdef_1", p)
-	p[0] = EnumDef(p, p[1])
-
-    def p_struct(self, p):
-	'struct :  STRUCT ID LBRACE fieldlist RBRACE'
-	self.pdebug("p_struct", p)
-	p[0] = StructType(p, p[2], p[4])
-
-	try:
-	    p[0].validate()
-	except ErrorException, e:
-	    self.errors+= e.errors
-
-    def p_exception(self, p):
-	'exception :  EXCEPTION ID LBRACE fieldlist RBRACE'
-	self.pdebug("p_struct", p)
-	p[0] = ExceptionType(p, p[2], p[4])
-
-	try:
-	    p[0].validate()
-	except ErrorException, e:
-	    self.errors+= e.errors
-
-    def p_namespace(self, p):
-	'namespace :  NAMESPACE namespacespecifier'
-	self.pdebug("p_struct", p)
-	p[0] = p[2]
-
-	try:
-	    self.program.validateNamespace(p[0])
-	except ErrorException, e:
-	    self.errors+= e.errors
-
-    def p_namespacespecifier_1(self, p):
-	'namespacespecifier : ID'
-	self.pdebug("p_namespacespecifier", p)
-	p[0] = p[1]
-	
-    def p_namespacespecifier_2(self, p):
-	'namespacespecifier : ID PERIOD namespacespecifier'
-	self.pdebug("p_namespacespecifier", p)
-	p[0] = p[1]+"."+p[3]
-
-    def p_service(self, p):
-	'service : SERVICE ID LBRACE functionlist RBRACE'
-	self.pdebug("p_service", p)
-	p[0] =  Service(p, p[2], p[4])
-	try:
-	    p[0].validate()
-	except ErrorException, e:
-	    self.errors+= e.errors
-
-    def p_functionlist_1(self, p):
-        'functionlist : function COMMA functionlist'
-	self.pdebug("p_functionlist_1", p)
-	p[0] = (p[1],) + p[3]
-
-    def p_functionlist_2(self, p):
-        'functionlist : function'
-	self.pdebug("p_functionlist_2", p)
-	p[0] = (p[1],)
-
-    def p_functionlist_3(self, p):
-        'functionlist : '
-	self.pdebug("p_functionlist_3", p)
-	p[0] = ()
-
-    def p_function(self, p):
-	'function : functiontype functionmodifiers ID LPAREN fieldlist RPAREN exceptionspecifier'
-	self.pdebug("p_function", p)
-
-	resultStruct = StructType(p, p[3]+"_result", (Field(p, p[1], Identifier(None, "success", 0)),)+p[7])
-	
-	p[0] = Function(p, p[3], resultStruct, StructType(p, p[3]+"_args", p[5]))
-	try:
-	    p[0].validate()
-	except ErrorException, e:
-	    self.errors+= e.errors
-
-    def p_functionmodifiers(self, p):
-	'functionmodifiers :'
-	self.pdebug("p_functionmodifiers", p)
-	p[0] = ()
-
-    def p_fieldlist_1(self, p):
-	'fieldlist : field COMMA fieldlist'
-	self.pdebug("p_fieldlist_1", p)
-	p[0] = (p[1],) + p[3]
-
-    def p_fieldlist_2(self, p):
-	'fieldlist : field'
-	self.pdebug("p_fieldlist_2", p)
-	p[0] = (p[1],)
-
-    def p_fieldlist_3(self, p):
-	'fieldlist :'
-	self.pdebug("p_fieldlist_3", p)
-	p[0] = ()
-
-    def p_field_1(self, p):
-        'field : fieldtype ID ASSIGN ICONST'
-	self.pdebug("p_field_1", p)
-	p[0] = Field(p, p[1], Identifier(None, p[2], int(p[4])))
-
-    def p_field_2(self, p):
-        'field : fieldtype ID'
-	self.pdebug("p_field_2", p)
-	p[0] = Field(p, p[1], Identifier(None, p[2]))
-
-    def p_exceptionSpecifier_1(self, p):
-	'exceptionspecifier : THROWS LPAREN fieldlist RPAREN'
-	self.pdebug("p_exceptionspecifier", p)
-	p[0] = p[3]
-
-    def p_exceptionSpecifier_2(self, p):
-	'exceptionspecifier : empty'
-	self.pdebug("p_exceptionspecifier", p)
-	p[0] = ()
-
-    def p_definitiontype_1(self, p):
-        'definitiontype : basetype'
-	self.pdebug("p_definitiontype_1", p)
-	p[0] = p[1]
-
-    def p_definitiontype_2(self, p):
-        'definitiontype : collectiontype'
-	self.pdebug("p_definitiontype_2", p)
-	p[0] = p[1]
-
-    def p_functiontype_1(self, p):
-        'functiontype : fieldtype'
-	self.pdebug("p_functiontype_1", p)
-	p[0] = p[1]
-		   
-    def p_functiontype_2(self, p):
-        'functiontype : VOID'
-	self.pdebug("p_functiontype_2", p)
-	p[0] = self.program.primitiveMap[p[1].lower()]
-
-    def p_fieldtype_1(self, p):
-        'fieldtype : ID'
-	self.pdebug("p_fieldtype_1", p)
-	p[0] = Identifier(p, p[1])
-
-    def p_fieldtype_2(self, p):
-        'fieldtype : basetype'
-	self.pdebug("p_fieldtype_2", p)
-	p[0] = p[1]
-
-    def p_fieldtype_3(self, p):
-        'fieldtype : collectiontype'
-	self.pdebug("p_fieldtype_3", p)
-	p[0] = p[1]
-
-    def p_basetype_1(self, p):
-        'basetype : STRING'
-	self.pdebug("p_basetype_1", p)
-	p[0] = self.program.primitiveMap[p[1].lower()]
-
-    def p_basetype_2(self, p):
-        'basetype : BYTE'
-	self.pdebug("p_basetype_2", p)
-	p[0] = self.program.primitiveMap[p[1].lower()]
-
-    def p_basetype_3(self, p):
-        'basetype : I08'
-	self.pdebug("p_basetype_3", p)
-	p[0] = self.program.primitiveMap[p[1].lower()]
-
-    def p_basetype_4(self, p):
-        'basetype : U08'
-	self.pdebug("p_basetype_4", p)
-	p[0] = self.program.primitiveMap[p[1].lower()]
-
-    def p_basetype_5(self, p):
-        'basetype : I16'
-	self.pdebug("p_basetype_5", p)
-	p[0] = self.program.primitiveMap[p[1].lower()]
-
-    def p_basetype_6(self, p):
-        'basetype : U16'
-	self.pdebug("p_basetype_6", p)
-	p[0] = self.program.primitiveMap[p[1].lower()]
-
-    def p_basetype_7(self, p):
-        'basetype : I32'
-	self.pdebug("p_basetype_7", p)
-	p[0] = self.program.primitiveMap[p[1].lower()]
-
-    def p_basetype_8(self, p):
-        'basetype : U32'
-	self.pdebug("p_basetype_8", p)
-	p[0] = self.program.primitiveMap[p[1].lower()]
-
-    def p_basetype_9(self, p):
-        'basetype : I64'
-	self.pdebug("p_basetype_9", p)
-	p[0] = self.program.primitiveMap[p[1].lower()]
-
-    def p_basetype_10(self, p):
-        'basetype : U64'
-	self.pdebug("p_basetype_10", p)
-	p[0] = self.program.primitiveMap[p[1].lower()]
-
-    def p_basetype_11(self, p):
-        'basetype : UTF8'
-	self.pdebug("p_basetype_11", p)
-	p[0] = self.program.primitiveMap[p[1].lower()]
-
-    def p_basetype_12(self, p):
-        'basetype : UTF16'
-	self.pdebug("p_basetype_12", p)
-	p[0] = self.program.primitiveMap[p[1].lower()]
-
-    def p_basetype_13(self, p):
-        'basetype : DOUBLE'
-	self.pdebug("p_basetype_13", p)
-	p[0] = self.program.primitiveMap[p[1].lower()]
-
-    def p_collectiontype_1(self, p):
-        'collectiontype : maptype'
-	self.pdebug("p_collectiontype_1", p)
-	p[0] = self.program.addCollection(p[1])
-
-    def p_collectiontype_2(self, p):
-        'collectiontype : settype'
-	self.pdebug("p_collectiontype_2", p)
-	p[0] = self.program.addCollection(p[1])
-
-    def p_collectiontype_3(self, p):
-        'collectiontype : listtype'
-	self.pdebug("p_collectiontype_3", p)
-	p[0] = self.program.addCollection(p[1])
-
-    def p_maptype(self, p):
-        'maptype : MAP LANGLE fieldtype COMMA fieldtype RANGLE'
-	self.pdebug("p_maptype", p)
-	p[0] = MapType(p, p[3], p[5])
-
-    def p_settype(self, p):
-        'settype : SET LANGLE fieldtype RANGLE'
-	self.pdebug("p_settype", p)
-	p[0] = SetType(p, p[3])
-
-    def p_listtype(self, p):
-        'listtype : LIST LANGLE fieldtype RANGLE'
-	self.pdebug("p_listtype", p)
-	p[0] = ListType(p, p[3])
-
-    def p_empty(self, p):
-	"empty : "
-	pass
-
-    def p_error(self, p):
-	# p_error is called with an empty token if eof was encountered unexpectedly.
-	if not p:
-	    self.errors.append(SyntaxError("Unexpected end of file"))
-	else:
-	    self.errors.append(SyntaxError(p))
-
-    def pdebug(self, name, p):
-	if self.debug:
-	    print(name+"("+string.join(["P["+str(ix)+"]<<"+str(p[ix])+">>" for ix in range(len(p))], ", ")+")")
-
-    def __init__(self, **kw):
-        self.debug = kw.get('debug', 0)
-        self.names = { }
-	self.program = Program()
-	self.errors = []
-
-        try:
-            modname = os.path.split(os.path.splitext(__file__)[0])[1] + "_" + self.__class__.__name__
-        except:
-            modname = "parser"+"_"+self.__class__.__name__
-        self.debugfile = modname + ".dbg"
-        self.tabmodule = modname + "_" + "parsetab"
-        #print self.debugfile, self.tabmodule
-
-        # Build the lexer and parser
-        lex.lex(module=self, debug=self.debug)
-        yacc.yacc(module=self,
-                  debug=self.debug,
-                  debugfile=self.debugfile,
-                  tabmodule=self.tabmodule)
-
-    def parsestring(self, s, filename=""):
-	yacc.parse(s)
-
-	if len(self.errors) == 0:
-	    try:
-		self.program.validate()
-	    except ErrorException, e:
-		self.errors+= e.errors
-	    
-	if len(self.errors):
-	    for error in self.errors:
-		print(filename+":"+str(error))
-
-    def parse(self, filename, doPickle=True):
-
-	f = file(filename, "r")
-
-	self.parsestring(f.read(), filename)
-
-        if len(self.errors) == 0 and doPickle:
-
-	    outf = file(os.path.splitext(filename)[0]+".thyc", "w")
-
-	    pickle.dump(self.program, outf)
diff --git a/compiler/py/src/php_generator.py b/compiler/py/src/php_generator.py
deleted file mode 100644
index 4ad990c..0000000
--- a/compiler/py/src/php_generator.py
+++ /dev/null
@@ -1,1021 +0,0 @@
-""" Thrift IDL PHP client stub generator
-    
-    This generated PHP class definitions and client stubs for a valid thrift IDL definition
-
-    Author(s): Mark Slee(mclee@facebook.com), Marc Kwiatkowski (marc@facebook.com)
-
-    $Id:
-"""
-import time
-
-import os
-import os.path
-from string import Template
-from thrift.parser import *
-from thrift.generator import *
-
-HEADER_COMMENT = """<?php
-/**
- * Autogenerated by Thrift
- * ${date}
- *
- * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
- */
- """
-
-PHP_TYPES_HEADER = Template(HEADER_COMMENT+"""
-require_once ${prefix}.'thrift/Thrift.php\';
-""")
-
-PHP_TYPES_FOOTER = Template("""
-?>
-""")
-
-PHP_SERVICES_HEADER = Template(HEADER_COMMENT+"""
-
-require_once dirname(__FILE__).\'/${source}_types.php\';
-require_once ${prefix}.'thrift/protocol/TType.php';
-require_once ${prefix}.'thrift/protocol/TProtocol.php';
-require_once ${prefix}.'thrift/transport/TTransport.php';
-""")
-
-PHP_SERVICES_FOOTER = Template("""
-?>
-""")
-
-PHP_IMPL_HEADER = Template(HEADER_COMMENT+"""
-
-require_once ${prefix}.'thrift/Thrift.php';
-require_once ${prefix}.dirname(__FILE__).\'/${source}_types.php\';
-
-""")
-
-PHP_IMPL_FOOTER = Template("""
-?>
-""")
-
-def php_debug(arg):
-    print(arg)
-
-class Indenter(object):
-    def __init__(self, margin=4):
-        self.margin = ''.join([' ' for ix in range(margin)])
-        self.level = 0
-
-    def __getitem__(self, level):
-        return ''.join([self.margin for ix in range(level)])
-
-    def __iadd__(self, value):
-        self.level = self.level + value
-        return self
-
-    def __isub__(self, value):
-        self.level = self.level - value
-        return self
-
-    def __call__(self):
-        return self.__getitem__(self.level)
-
-class Variable(object):
-    def __init__(self, ttype, name):
-        self.ttype = ttype
-        self.name = name
-
-    def toDeclaration(self, new=False):
-	if not new:
-	    defaultValue = defaultValueForType(self.ttype)
-	else:
-	    defaultValue = newInstanceForType(self.ttype)
-        return self.name+" = "+defaultValue
-
-class Scope(object):
-    def __init__(self, parent=None):
-        self.index = 0
-        self.vars = {}
-        self.parent = parent
-	self.childIndex = 0
-        if self.parent:
-            self.level = self.parent.level + 1
-	    self.index = self.parent.childIndex 
-	    self.parent.childIndex+= 1
-	    self.suffix = self.parent.suffix+str(self.index)
-        else:
-            self.level = 0
-	    self.index = 0
-	    self.suffix = ""
-
-    def declare(self, ttype, name):
-        if name in self.vars:
-            raise Exception, "Variable \""+name+"\" already declared in this  scope."
-	result = Variable(ttype, "$_"+name+self.suffix)
-        self.vars[name] = result
-        return result
-
-    def get(self, var):
-        if var.name in self.vars:
-            return self.vars[var.name]
-        elif self.parent:
-            return self.parent.get(var)
-        else:
-            raise Exception, "Variable \""+var.name+"\" does not exist in any enclosing scope"
-
-PHP_TYPE_PROTOCOL_MAP = {
-    BOOL_TYPE : "Bool",
-    STRING_TYPE: "String",
-    UTF7_TYPE: "String",
-    UTF8_TYPE: "Wstring",
-    BYTE_TYPE : "Byte",
-    I08_TYPE: "Byte",
-    I16_TYPE: "I16",
-    I32_TYPE: "I32",
-    I64_TYPE: "I64",
-    I16_TYPE: "I16",
-    I32_TYPE: "I32",
-    I64_TYPE: "I64",
-    U08_TYPE: "Byte",
-    U16_TYPE: "U16",
-    U32_TYPE: "U32",
-    U64_TYPE: "U64",
-    U16_TYPE: "U16",
-    U32_TYPE: "U32",
-    U64_TYPE: "U64",
-    FLOAT_TYPE: "Float",
-    DOUBLE_TYPE: "Double"
-   }
-            
-PHP_PRIMITIVE_TYPE_IO_METHOD_SUFFIX_MAP = {
-    "void" :"Void",
-    "bool" : "Bool",
-    "string": "String",
-    "utf7": "String",
-    "utf8": "String", 
-    "utf16": "String",
-    "i08": "Byte",
-    "i16": "I16",
-    "i32": "I32", 
-    "i64": "I64", 
-    "u08": "Byte",
-    "u16": "U16",
-    "u32": "U32",
-    "u64": "U64",
-    "float": "Float",
-    "double": "Double"
-}
-
-class CodeGenerator(object):
-    def __init__(self,
-                 scope=Scope(),
-		 indent = Indenter()):
-        self.scope = scope
-	self.indent = indent
-
-    def newScope(self):
-	self.scope = Scope(self.scope)
-
-    def oldScope(self):
-	if not self.scope.parent:
-	    raise Exception, "Unbalanced scope entry/exit"
-
-	self.scope = self.scope.parent
-
-    def declare(self, type, name, defaultValue=None):
-        tvar = self.scope.declare(type, name)
-        return tvar
-
-    def toDeclaration(self, tvar, new=False):
-	if not new:
-	    defaultValue = defaultValueForType(tvar.ttype)
-	else:
-	    defaultValue = newInstanceForType(tvar.ttype)
-
-        return self.indent()+tvar.name+" = "+defaultValue+";\n"
-
-class Reader(CodeGenerator):
-    def __init__(self,
-                 iprot="$this->_iprot",
-                 itrans="$this->_itrans",
-                 scope=Scope(),
-		 indent = Indenter()):
-	CodeGenerator.__init__(self, scope, indent)
-        self.iprot = iprot
-        self.itrans = itrans
-
-    def toReadMessageBegin(self, messageNameVar, messageTypeVar, seqidVar):
-        return self.indent()+self.iprot+"->readMessageBegin("+self.itrans+", "+messageNameVar.name+", "+messageTypeVar.name+", "+seqidVar.name+");\n"
-
-    def toReadMessageEnd(self):
-        return self.indent()+self.iprot+"->readMessageEnd("+self.itrans+");\n"
-
-    def toReadStructBegin(self, structNameVar):
-        return self.indent()+self.iprot+"->readStructBegin("+self.itrans+", "+structNameVar.name+");\n"
-
-    def toReadStructEnd(self):
-        return self.indent()+self.iprot+"->readStructEnd("+self.itrans+");\n"
-
-    def toReadMapBegin(self, keyTypeVar, valueTypeVar, sizeVar):
-        return self.indent()+self.iprot+"->readMapBegin("+self.itrans+", "+keyTypeVar.name+", "+valueTypeVar.name+", "+sizeVar.name+");\n"
-
-    def toReadMapEnd(self):
-        return self.indent()+self.iprot+"->readMapEnd("+self.itrans+");\n"
-
-    def toReadSetBegin(self, valueTypeVar, sizeVar):
-        return self.indent()+self.iprot+"->readSetBegin("+self.itrans+", "+valueTypeVar.name+", "+sizeVar.name+");\n"
-
-    def toReadSetEnd(self):
-        return self.indent()+self.iprot+"->readSetEnd("+self.itrans+");\n"
-
-    def toReadListBegin(self, valueTypeVar, sizeVar):
-        return self.indent()+self.iprot+"->readListBegin("+self.itrans+", "+valueTypeVar.name+", "+sizeVar.name+");\n"
-
-    def toReadListEnd(self):
-        return self.indent()+self.iprot+"->readListEnd("+self.itrans+");\n"
-
-    def toReadFieldBegin(self, fieldNameVar, fieldTypeVar, fieldIdVar):
-        return self.indent()+self.iprot+"->readFieldBegin("+self.itrans+", "+fieldNameVar.name+", "+fieldTypeVar.name+", "+fieldIdVar.name+");\n"
-
-    def toReadFieldEnd(self):
-        return self.indent()+self.iprot+"->readFieldEnd("+self.itrans+");\n"
-
-    def toSkipField(self, fieldTypeVar):
-        return self.indent()+self.iprot+"->skip("+self.itrans+", "+fieldTypeVar.name+");\n"
-
-    def toReadPrimitive(self, value, suffix):
-        return self.indent()+self.iprot+"->read"+suffix+"("+self.itrans+", "+value+");\n"
-
-    def toRead(self, value, ttype):
-
-        if isinstance(ttype, PrimitiveType):
-            return self.toReadPrimitive(value, PHP_TYPE_PROTOCOL_MAP[ttype])
-
-        elif isinstance(ttype, StructType):
-	    self.newScope()
-            result = self.toReadStruct(value, ttype)
-	    self.oldScope()
-	    return result
-
-        elif isinstance(ttype, CollectionType):
-	    self.newScope()
-            result = self.toReadCollection(value, ttype)
-	    self.oldScope()
-	    return result
-
-        elif isinstance(ttype, EnumType):
-	    return self.toReadPrimitive(value, PHP_TYPE_PROTOCOL_MAP[I32_TYPE])
-
-        elif isinstance(ttype, TypedefType):
-            return self.toRead(value, ttype.definitionType)
-
-        else:
-            raise Exception, "Unsupported type "+str(type(ttype))+":"+str(ttype)
-
-    def toReadStruct(self, value, struct):
-
-        nameVar = self.declare(STRING_TYPE, "name")
-        fieldIdVar = self.declare(I16_TYPE, "fieldId")
-        fieldTypeVar = self.declare(U32_TYPE, "fieldType")
-	localVars = [nameVar, fieldTypeVar, fieldIdVar]
-
-        result= string.join([self.toDeclaration(localVar) for localVar in localVars], "")
-
-        result+= self.toReadStructBegin(nameVar)
-
-        result+= self.indent()+"while(true) {\n"
-
-        self.indent += 1
-
-        result+= self.toReadFieldBegin(nameVar, fieldTypeVar, fieldIdVar) 
-
-        result += self.indent()+"if("+fieldTypeVar.name+" == "+PHP_PROTOCOL_TSTOP+") {\n"
-
-        self.indent+= 1
-
-        result+= self.indent()+"break;\n"
-
-        self.indent-= 1
-
-        result+= self.indent()+"}\n"
-
-        result+= self.indent()+"switch("+fieldIdVar.name+") {\n"
-
-        self.indent+= 1
-
-        # Sort field list in order of increasing ids
-
-        fieldList = []
-
-        fieldList+= struct.fieldList
-
-        fieldList.sort(lambda a,b: a.id - b.id)
-
-        for field in fieldList:
-            if isVoidType(field.type):
-                continue
-
-            result+= self.indent()+"case "+str(field.id)+":\n"
-
-            result+= self.toRead(value+"->"+field.name, field.type)
-	    result+= self.indent()+"break;\n"
-
-        result+= self.indent()+"default:\n"
-        result+= self.toSkipField(fieldTypeVar)
-        result+= self.indent()+"break;\n"
-
-        self.indent-= 1
-
-        result+= self.indent()+"}\n"
-
-        self.indent-= 1
-
-        result+= self.indent()+"}\n"
-
-        result+= self.toReadStructEnd()
-
-        return result
-
-    def toReadCollection(self, value, collection):
-
-        isMap = isinstance(collection, MapType)
-
-        sizeVar = self.declare(U32_TYPE, "size")
-        valueTypeVar = self.declare(U32_TYPE, "valueType")
-        elemVar = self.declare(collection.valueType, "elem")
-        localVars = [sizeVar, valueTypeVar, elemVar]
-
-        if isMap:
-            keyTypeVar = self.declare(U32_TYPE, "keyType")
-            key = self.declare(collection.keyType, "key")
-            localVars+= [keyTypeVar, key]
-
-        ix = self.declare(U32_TYPE, "ix")
-
-        result= string.join([self.toDeclaration(localVar) for localVar in localVars], "")
-
-        if isMap:
-            result+= self.toReadMapBegin(keyTypeVar, valueTypeVar, sizeVar)
-        elif isinstance(collection, ListType):
-            result+= self.toReadListBegin(valueTypeVar, sizeVar)
-        elif isinstance(collection, SetType):
-            result+= self.toReadSetBegin(valueTypeVar, sizeVar)
-	else:
-	    raise Exception, "Unknown collection type "+str(collection)
-
-        result+= self.indent()+"for("+ix.name+" = 0; "+ix.name+" < "+sizeVar.name+"; ++"+ix.name+") {\n"
-
-        self.indent+= 1
-
-	if isMap:
-	    result+= self.toRead(key.name, collection.keyType)
-
-	result+= self.toRead(elemVar.name, collection.valueType)
-	
-        if isMap:
-            result+= self.indent()+value+"["+key.name+"] = "+elemVar.name+";\n"
-        else:
-            result+= self.indent()+value+"[] = "+elemVar.name+";\n"
-
-	self.indent-= 1
-
-	result+= self.indent()+"}\n"
-
-        if isMap:
-            result+= self.toReadMapEnd()
-        elif isinstance(collection, ListType):
-            result+= self.toReadListEnd()
-        elif isinstance(collection, SetType):
-            result+= self.toReadSetEnd()
-	else:
-	    raise Exception, "Unknown collection type "+str(collection)
-
-	return result
-
-class Writer(CodeGenerator):
-    def __init__(self,
-                 oprot="$this->_oprot",
-                 otrans="$this->_otrans",
-                 scope=Scope(),
-		 indent=Indenter()):
-	CodeGenerator.__init__(self, scope, indent)
-        self.oprot = oprot
-        self.otrans = otrans
-
-    def toWriteMessageBegin(self, messageName, type, seqid):
-        return self.indent()+self.oprot+"->writeMessageBegin("+self.otrans+", "+messageName+", "+type+", "+seqid+");\n"
-
-    def toWriteMessageEnd(self):
-        return self.indent()+self.oprot+"->writeMessageEnd("+self.otrans+");\n"
-
-    def toWriteStructBegin(self, structName):
-        return self.indent()+self.oprot+"->writeStructBegin("+self.otrans+", "+structName+");\n"
-
-    def toWriteStructEnd(self):
-        return self.indent()+self.oprot+"->writeStructEnd("+self.otrans+");\n"
-
-    def toWriteMapBegin(self, keyType, valueType, size):
-        return self.indent()+self.oprot+"->writeMapBegin("+self.otrans+", "+keyType+", "+valueType+", "+size+");\n"
-
-    def toWriteMapEnd(self):
-        return self.indent()+self.oprot+"->writeMapEnd("+self.otrans+");\n"
-
-    def toWriteSetBegin(self, valueType, size):
-        return self.indent()+self.oprot+"->writeSetBegin("+self.otrans+", "+valueType+", "+size+");\n"
-
-    def toWriteSetEnd(self):
-        return self.indent()+self.oprot+"->writeSetEnd("+self.otrans+");\n"
-
-    def toWriteListBegin(self, valueType, size):
-        return self.indent()+self.oprot+"->writeListBegin("+self.otrans+", "+valueType+", "+size+");\n"
-
-    def toWriteListEnd(self):
-        return self.indent()+self.oprot+"->writeListEnd("+self.otrans+");\n"
-
-    def toWriteFieldBegin(self, fieldName, fieldType, fieldId):
-        return self.indent()+self.oprot+"->writeFieldBegin("+self.otrans+", "+fieldName+", "+fieldType+", "+str(fieldId)+");\n"
-
-    def toWriteFieldEnd(self):
-        return self.indent()+self.oprot+"->writeFieldEnd("+self.otrans+");\n"
-
-    def toWriteFieldStop(self):
-        return self.indent()+self.oprot+"->writeFieldStop("+self.otrans+");\n"
-
-    def toSkipField(self, fieldType):
-        return self.indent()+self.oprot+"->skipField("+self.otrans+", "+fieldType+");\n"
-
-    def toWriteFlush(self):
-	return self.indent()+self.otrans+"->flush();\n"
-
-    def toWritePrimitive(self, value, suffix):
-        return self.indent()+self.oprot+"->write"+suffix+"("+self.otrans+", "+value+");\n"
-
-    def toWrite(self, value, ttype):
-
-        if isinstance(ttype, PrimitiveType):
-            return self.toWritePrimitive(value, PHP_TYPE_PROTOCOL_MAP[ttype])
-
-        elif isinstance(ttype, StructType):
-	    self.newScope()
-            result = self.toWriteStruct(value, ttype)
-	    self.oldScope()
-	    return result
-
-        elif isinstance(ttype, CollectionType):
-	    self.newScope()
-            result = self.toWriteCollection(value, ttype)
-	    self.oldScope()
-	    return result
-
-        elif isinstance(ttype, EnumType):
-	    return self.toWritePrimitive(value, PHP_TYPE_PROTOCOL_MAP[I32_TYPE])
-
-        elif isinstance(ttype, TypedefType):
-            return self.toWrite(value, ttype.definitionType)
-
-        else:
-            raise Exception, "Unsupported type "+str(type(ttype))+":"+str(ttype)
-
-    def toWriteStruct(self, value, struct):
-
-	result=self.indent()+"{\n"
-
-	self.indent+= 1
-
-        result+= self.toWriteStructBegin("\""+struct.name+"\"")
-
-        for field in struct.fieldList:
-            if isVoidType(field.type):
-                continue
-
-            result+= self.toWriteFieldBegin("\""+field.name+"\"", toWireType(field.type), field.id)
-	    result+= self.toWrite(value+"->"+field.name,  field.type)
-            result+= self.toWriteFieldEnd()
-
-	result+= self.toWriteFieldStop()
-
-	result+= self.toWriteStructEnd()
-
-	self.indent-= 1
-
-	result+= self.indent()+"}\n"
-
-        return result
-
-    def toWriteCollection(self, value, collection):
-
-	result=self.indent()+"{\n"
-
-	self.indent+= 1
-
-	size = "count("+value+")"
-
-        isMap = isinstance(collection, MapType)
-
-        elemVar = self.declare(VOID_TYPE, "elem")
-
-        if isMap:
-	    keyVar = self.declare(VOID_TYPE, "key")
-            result+= self.toWriteMapBegin(toWireType(collection.keyType), toWireType(collection.valueType), size)
-        elif isinstance(collection, ListType):
-            result+= self.toWriteListBegin(toWireType(collection.valueType), size)
-        elif isinstance(collection, SetType):
-            result+= self.toWriteSetBegin(toWireType(collection.valueType), size)
-	else:
-	    raise Exception, "Unknown collection type "+str(collection)
-
-	if isMap:
-
-	    result+= self.indent()+"foreach("+value+" as "+keyVar.name+" => "+elemVar.name+") {\n"
-
-	else:
-
-	    result+= self.indent()+"foreach("+value+" as "+elemVar.name+") {\n"
-	    
-        self.indent+= 1
-
-	if isMap:
-	    result+= self.toWrite(keyVar.name, collection.keyType)
-
-	result+= self.toWrite(elemVar.name, collection.valueType)
-	
-	self.indent-= 1
-
-	result+= self.indent()+"}\n"
-
-        if isMap:
-            result+= self.toWriteMapEnd()
-        elif isinstance(collection, ListType):
-            result+= self.toWriteListEnd()
-        elif isinstance(collection, SetType):
-            result+= self.toWriteSetEnd()
-	else:
-	    raise Exception, "Unknown collection type "+str(collection)
-
-	self.indent-= 1
-
-	result+= self.indent()+"}\n"
-
-	return result
-
-class ClientFunctionGenerator(CodeGenerator):
-    def __init__(self,
-		 scope=Scope(),
-		 indent=Indenter()):
-	CodeGenerator.__init__(self, scope, indent)
-	self.reader = Reader(scope=scope, indent=indent)
-	self.writer = Writer(scope=scope, indent=indent)
-
-    def __call__(self, function):
-	
-	result= self.indent()+"public function "+function.name+"("+string.join(["$arg"+str(ix) for ix in  range(len(function.args()))], ", ")+") {\n"
-
-	self.newScope()
-
-	self.indent+= 1
-
-	result+= self.writer.toWriteMessageBegin("\""+function.name+"\"", PHP_PROTOCOL_CALL, "$this->seqid")
-	result+= self.indent()+"$this->_seqid++;\n"
-
-	# Send the args struct 
-
-	result+= self.indent()+"{\n"
-
-	self.newScope()
-
-	self.indent+= 1
-
-	result+= self.writer.toWriteStructBegin("\""+function.argsStruct.name+"\"")
-
-        for ix in range(len(function.argsStruct.fieldList)):
-	    field = function.argsStruct.fieldList[ix]
-            if isVoidType(field.type):
-                continue
-
-            result+= self.writer.toWriteFieldBegin("\""+field.name+"\"", toWireType(field.type), field.id)
-	    result+= self.writer.toWrite("$arg"+str(ix),  field.type)
-            result+= self.writer.toWriteFieldEnd()
-
-	result+= self.writer.toWriteFieldStop()
-
-	result+= self.writer.toWriteStructEnd()
-
-	self.indent-= 1
-
-	self.oldScope()
-
-	result+= self.indent()+"}\n"
-
-	result+= self.writer.toWriteMessageEnd()
-
-	result+= self.writer.toWriteFlush();
-
-	resultVar = self.declare(function.resultStruct, "result")
-	nameVar = self.declare(STRING_TYPE, "name")
-	typeVar = self.declare(U32_TYPE, "type")
-	seqidVar = self.declare(U32_TYPE, "seqid")
-
-	result+= self.toDeclaration(resultVar, True)
-	result+= self.toDeclaration(nameVar)
-	result+= self.toDeclaration(typeVar)
-	result+= self.toDeclaration(seqidVar)
-
-	result+= self.reader.toReadMessageBegin(nameVar, typeVar, seqidVar)
-
-	result+= self.indent()+"{\n"
-
-	self.newScope()
-
-	self.indent+= 1
-
-	result+= self.reader.toRead(resultVar.name, function.resultStruct)
-
-	self.indent-= 1
-
-	self.oldScope()
-
-	result+= self.indent()+"}\n"
-
-	result+= self.reader.toReadMessageEnd()
-
-	if not isVoidType(function.returnType()):
-	    result+= self.indent()+"return "+resultVar.name+"->success;\n"
-	else:
-	    result+= self.indent()+"return;\n"
-
-	self.indent-= 1
-
-	self.oldScope()
-
-	result+= self.indent()+"}\n"
-	
-	return result
-
-class ClientServiceGenerator(CodeGenerator):
-    def __init__(self,
-		 scope=Scope(),
-		 indent=Indenter()):
-	CodeGenerator.__init__(self, scope, indent)
-	self.functionGenerator =  ClientFunctionGenerator(scope, indent)
-
-    def __call__(self, service):
-	
-	result= self.indent()+"class "+service.name+"Client extends "+service.name+"If {\n"
-
-	self.indent+= 1
-
-	result+= self.indent()+"private $_itrans = null;\n"
-	result+= self.indent()+"private $_otrans = null;\n\n"
-
-	result+= self.indent()+"private $_iprot = null;\n"
-	result+= self.indent()+"private $_oprot = null;\n\n"
-	result+= self.indent()+"private $_seqid = 0;\n\n"
-
-	result+= self.indent()+"public function __construct() {\n"
-	self.indent+= 1
-
-	result+= self.indent()+"$argv = func_get_args();\n"
-	result+= self.indent()+"$argc = count($argv);\n"
-	result+= self.indent()+"if ($argc == 2) {;\n"
-	self.indent+= 1
-	result+= self.indent()+"$this->_itrans = $this->_otrans = $argv[0];\n"
-	result+= self.indent()+"$this->_iprot = $this->_oprot = $argv[1];\n"
-	self.indent-= 1
-	result+= self.indent()+"} else if($argc == 4) {\n"
-	self.indent+= 1
-	result+= self.indent()+"$this->_itrans = $argv[0];\n"
-	result+= self.indent()+"$this->_otrans = $argv[1];\n"
-	result+= self.indent()+"$this->_iprot = $argv[2];\n"
-	result+= self.indent()+"$this->_oprot = $argv[3];\n"
-	self.indent-= 1
-	result+= self.indent()+"}\n"
-	self.indent-= 1
-	result+= self.indent()+"}\n\n"
-
-	for function in service.functionList:
-
-	    result+= self.functionGenerator(function)
-	
-	self.indent-= 1
-	result+= self.indent()+"}\n"
-
-	return result
-
-PHP_PRIMITIVE_DEFAULT_MAP = {
-    VOID_TYPE : "",
-    BOOL_TYPE : "False",
-    STRING_TYPE: "\'\'",
-    UTF7_TYPE: "\'\'",
-    UTF8_TYPE: "\'\'",
-    UTF16_TYPE: "\'\'",
-    BYTE_TYPE : "0",
-    I08_TYPE: "0",
-    I16_TYPE: "0",
-    I32_TYPE: "0",
-    I64_TYPE: "0",
-    U08_TYPE: "0",
-    U16_TYPE: "0",
-    U32_TYPE: "0",
-    U64_TYPE: "0",
-    FLOAT_TYPE: "0.0",
-    DOUBLE_TYPE: "0.0"
-}
-
-def toPHPNamespacePrefix(namespace):
-    """No namespaces in PHP"""
-    return ""
-
-def toPHPNamespaceSuffix(namespace):
-    """No namespaces in PHP"""
-    return ""
-
-def defaultValueForType(ttype, value=None):
-    """Returns the default literal value for a given type"""
-
-    if value:
-	return value
-    elif isinstance(ttype, PrimitiveType):
-        return PHP_PRIMITIVE_DEFAULT_MAP[ttype]
-    elif isinstance(ttype, CollectionType):
-        return "array()"
-    elif isinstance(ttype, StructType):
-        return "null"
-    elif isinstance(ttype, EnumType):
-        return "0"
-    elif isinstance(ttype, TypedefType):
-        return defaultValueForType(toCanonicalType(ttype))
-    else:
-        raise Exception, "Unknown type "+str(ttype)
-
-def newInstanceForType(ttype, value=None):
-    """Returns the default new instance for a given type"""
-
-    if value:
-	return value
-    elif isinstance(ttype, StructType):
-        return "new "+ttype.name+"()"
-    else:
-	return defaultValueForType(ttype, value)
-
-def toPHPTypeDeclaration(ttype):
-    """ Converts the thrift IDL type to the corresponding PHP type.  Note that if ttype is FieldType, this function 
-converts to type declaration followed by field name, i.e. \"string string_thing\""""
-
-    if isinstance(ttype, Field):
-        return "$"+ttype.name
-    if isinstance(ttype, Function):
-        return ttype.name+"("+string.join([toPHPTypeDeclaration(arg) for arg in ttype.args()], ", ")+")"
-    else:
-        return ""
-
-def toTypedefDefinition(typedef):
-    """Converts a thrift typedef to a PHP typdef definition."""
-
-    return ""
-
-def toEnumDefinition(enum):
-    """ Converts a thrift enum to a PHP enum """
-
-    result = "$GLOBALS[\'E_"+enum.name+"\'] = array(\n"
-
-    result += string.join(["    \'"+ed.name+"\' => "+str(ed.id)+",\n" for ed in  enum.enumDefs], "")
-
-    result+= ");\n\n"
-
-    result += "final class "+enum.name+" {\n"
-
-    result += string.join(["    const "+ed.name+" = "+str(ed.id)+";\n" for ed in  enum.enumDefs], "")
-
-    result += "}\n"
-
-    return result
-
-def toStructDefinition(struct):
-    """Converts a thrift struct to a PHP class"""
-
-    result = "class "+struct.name+" {\n"
-
-    # Create constructor defaults for primitive types
-
-    # Field declarations
-
-    result+= string.join(["    public $"+field.name+" = "+defaultValueForType(field.type)+";\n" for field in struct.fieldList if not isVoidType(field.type)], "")
-
-    # bring it on home
-
-    result+= "}\n"
-
-    return result
-
-PHP_DEFINITION_MAP = {
-    TypedefType : toTypedefDefinition,
-    EnumType : toEnumDefinition,
-    StructType : toStructDefinition,
-    ExceptionType : toStructDefinition,
-    Service : None
-    }
-    
-def toDefinitions(definitions):
-    """Converts an arbitrary thrift grammatical unit definition to the corresponding PHP definition"""
-
-    result = ""
-
-    for definition in definitions:
-
-        writer = PHP_DEFINITION_MAP[type(definition)]
-
-        if writer:
-            result+= writer(definition)+"\n"
-
-    return result
-
-PHP_THRIFT_NS = "facebook::thrift"
-
-PHP_INTERFACE_FUNCTION_DECLARATION = Template("""    public abstract function ${functionDeclaration};
-""")
-
-PHP_INTERFACE_DECLARATION = Template("""
-abstract class ${service}If {
-${functionDeclarations}};
-""")
-
-def toServiceInterfaceDeclaration(service, debugp=None):
-    """Converts a thrift service definition into a C++ abstract base class"""
-
-    functionDeclarations = string.join([PHP_INTERFACE_FUNCTION_DECLARATION.substitute(service=service.name, functionDeclaration=toPHPTypeDeclaration(function)) for function in service.functionList], "")
-
-    return PHP_INTERFACE_DECLARATION.substitute(service=service.name, functionDeclarations=functionDeclarations)
-
-PHP_EXCEPTION = PHP_THRIFT_NS+"::Exception"
-
-PHP_SP = Template("boost::shared_ptr<${klass}> ")
-
-
-PHP_PROTOCOL_TSTOP = "TType::STOP"
-PHP_PROTOCOL_TTYPE = "TType::"
-PHP_PROTOCOL_CALL = "TMessageType::CALL"
-PHP_PROTOCOL_REPLY = "TMessageType::REPLY"
-
-PHP_TTYPE_MAP = {
-    STOP_TYPE : PHP_PROTOCOL_TTYPE+"STOP",
-    VOID_TYPE : PHP_PROTOCOL_TTYPE+"VOID",
-    BOOL_TYPE : PHP_PROTOCOL_TTYPE+"BOOL",
-    UTF7_TYPE : PHP_PROTOCOL_TTYPE+"UTF7",
-    UTF7_TYPE : PHP_PROTOCOL_TTYPE+"UTF7",
-    UTF8_TYPE : PHP_PROTOCOL_TTYPE+"UTF8",
-    UTF16_TYPE : PHP_PROTOCOL_TTYPE+"UTF16",
-    U08_TYPE : PHP_PROTOCOL_TTYPE+"U08",
-    I08_TYPE : PHP_PROTOCOL_TTYPE+"I08",
-    I16_TYPE : PHP_PROTOCOL_TTYPE+"I16",
-    I32_TYPE : PHP_PROTOCOL_TTYPE+"I32",
-    I64_TYPE : PHP_PROTOCOL_TTYPE+"I64",
-    U08_TYPE : PHP_PROTOCOL_TTYPE+"U08",
-    U16_TYPE : PHP_PROTOCOL_TTYPE+"U16",
-    U32_TYPE : PHP_PROTOCOL_TTYPE+"U32",
-    U64_TYPE : PHP_PROTOCOL_TTYPE+"U64",
-    FLOAT_TYPE : PHP_PROTOCOL_TTYPE+"FLOAT",
-    DOUBLE_TYPE : PHP_PROTOCOL_TTYPE+"DOUBLE",
-    StructType : PHP_PROTOCOL_TTYPE+"STRUCT",
-    ExceptionType : PHP_PROTOCOL_TTYPE+"STRUCT",
-    ListType : PHP_PROTOCOL_TTYPE+"LST",
-    MapType : PHP_PROTOCOL_TTYPE+"MAP",
-    SetType : PHP_PROTOCOL_TTYPE+"SET"
-}
-
-
-def toWireType(ttype):
-    """Converts a thrift type to the corresponding wire type.   This differs from toPHPTypeDeclaration in that it reduces typedefs
-to their canonical form and converts enums to signedf 32 bit integers"""
-
-    if isinstance(ttype, PrimitiveType):
-	return PHP_TTYPE_MAP[ttype]
-
-    elif isinstance(ttype, EnumType):
-	return PHP_TTYPE_MAP[I32_TYPE]
-
-    elif isinstance(ttype, TypedefType):
-	return toWireType(toCanonicalType(ttype))
-
-    elif isinstance(ttype, StructType) or isinstance(ttype, CollectionType):
-	return PHP_TTYPE_MAP[type(ttype)]
-
-    else:
-	raise Exception, "No wire type for thrift type: "+str(ttype)
-
-def toGenDir(filename, suffix="gen-php", debugp=None):
-    """creates a generated-code subdirectory for C++ code based on filename of thrift source file and optional suffix"""
-
-    result = os.path.join(os.path.split(filename)[0], suffix)
-
-    if not os.path.exists(result):
-        os.mkdir(result)
-
-    return result
-
-def toBasename(filename, debugp=None):
-    """ Take the filename minus the path and\".thrift\" extension  if present """
-
-    basename = os.path.split(filename)[1]
-
-    tokens = os.path.splitext(basename)
-
-    if tokens[1].lower() == ".thrift":
-        basename = tokens[0]
-
-    if debugp:
-        debugp("toBasename("+str(filename)+") => "+str(basename))
-
-    return basename
-
-def toDefinitionHeaderName(filename, genDir=None, debugp=None):
-    """Creates a file name for the public thrift data types based on filename of thrift source file and optional suffix"""
-
-    if not genDir:
-        genDir = toGenDir(filename)
-
-    basename = toBasename(filename)
-
-    result = os.path.join(genDir, basename+"_types.php")
-
-    if debugp:
-        debugp("toDefinitionHeaderName("+str(filename)+", "+str(genDir)+") => "+str(basename))
-
-    return result
-
-def writeDefinitionHeader(program, filename, genDir=None, debugp=None):
-    """Writes public thrift data types defined in program into a public data types header file.  Uses the name of the original
-thrift source, filename, and the optional generated C++ code directory, genDir, to determine the name and location of header file"""
-
-    definitionHeader = toDefinitionHeaderName(filename, genDir)
-
-    if debugp:
-        debugp("definitionHeader: "+str(definitionHeader))
-
-    phpFile = file(definitionHeader, "w")
-
-    basename = toBasename(filename)
-
-    phpFile.write(PHP_TYPES_HEADER.substitute(prefix=PREFIX, source=basename, date=time.ctime(), namespacePrefix=toPHPNamespacePrefix(program.namespace)))
-
-    phpFile.write(toDefinitions(program.definitions))
-
-    phpFile.write(PHP_TYPES_FOOTER.substitute(source=basename, namespaceSuffix=toPHPNamespaceSuffix(program.namespace)))
-
-    phpFile.close()
-
-def toToImplementationSourceName(filename, genDir=None, debugp=None):
-    """Creates a file name for the public thrift data types based on filename of thrift source file and optional suffix"""
-
-    if not genDir:
-        genDir = toGenDir(filename)
-
-    basename = toBasename(filename)
-
-    result = os.path.join(genDir, basename+".php")
-
-    if debugp:
-        debugp("toToImplementationSourceName("+str(filename)+", "+str(genDir)+") => "+str(basename))
-
-    return result
-
-def writeImplementationSource(program, filename, genDir=None, debugp=None):
-    """Writes public thrift service interface, client stubs, and private types defined in a thrift program into a php library file.  Uses the name of the original
-thrift source, filename, and the optional generated C++ code directory, genDir, to determine the name and location of header file"""
-
-    toImplementationSource = toToImplementationSourceName(filename, genDir)
-
-    if debugp:
-        debugp("toImplementationSource: "+str(toImplementationSource))
-
-    phpFile = file(toImplementationSource, "w")
-
-    basename = toBasename(filename)
-
-    phpFile.write(PHP_SERVICES_HEADER.substitute(prefix=PREFIX, source=basename, date=time.ctime(), namespacePrefix=toPHPNamespacePrefix(program.namespace)))
-
-    # Generate classes for function result "structs"
-
-    privateStructs = []
-
-    for service in program.serviceMap.values():
-	
-	phpFile.write(toServiceInterfaceDeclaration(service))
-
-	for function in service.functionList:
-	    privateStructs.append(function.resultStruct)
-
-    phpFile.write(toDefinitions(privateStructs))    
-
-    serviceGenerator = ClientServiceGenerator()
-
-    for service in program.serviceMap.values():
-
-	phpFile.write(serviceGenerator(service))
-	
-    phpFile.write(PHP_SERVICES_FOOTER.substitute(source=basename, namespaceSuffix=toPHPNamespaceSuffix(program.namespace)))
-
-    phpFile.close()
-
-class PHPGenerator(Generator):
-
-    def __call__(self, program, filename, genDir=None, debugp=None):
-
-        writeDefinitionHeader(program, filename, genDir, debugp)
-        
-        writeImplementationSource(program, filename, genDir, debugp)
diff --git a/compiler/py/src/thrift b/compiler/py/src/thrift
deleted file mode 100644
index 6c252d9..0000000
--- a/compiler/py/src/thrift
+++ /dev/null
@@ -1,59 +0,0 @@
-#!python
-import sys
-from thrift import generator
-from thrift import cpp_generator
-from thrift import php_generator
-from thrift import parser
-
-def thrift(source, cpp=False, java=False, perl=False, php=False, python=False, ruby=False, debug=False):
-
-    generators = []
-
-    if cpp:
-	generators.append(cpp_generator.CPPGenerator())
-    
-    if php:
-	generators.append(php_generator.PHPGenerator())
-    
-    p = parser.Parser(debug=debug)
-
-    p.parse(source, False)
-
-    for generator in generators:
-	generator(p.program, source)
-
-    if len(p.errors):
-	return -1
-    else:
-	return 0
-
-def main(args):
-
-    cpp = False
-    perl = False
-    php = False
-    python = False
-    java = False
-    ruby = False
-
-    debug = False
-
-    if "--cpp" in args:
-	cpp = True
-	args.remove("--cpp")
-    if "--php" in args:
-	php = True
-	args.remove("--php")
-    if "--debug" in args:
-	debug = True
-	args.remove("--debug")
-
-    filename = args[-1]
-
-    result = thrift(filename, cpp, java, perl, php, python, ruby, debug)
-
-    sys.exit(result)
-
-if __name__ == '__main__':
-    main(sys.argv)
-
diff --git a/configure.ac b/configure.ac
index b676d31..8168a12 100644
--- a/configure.ac
+++ b/configure.ac
@@ -8,6 +8,6 @@
 
 AC_CONFIG_FILES([Makefile])
 
-AC_CONFIG_SUBDIRS([compiler/py lib/cpp lib/php lib/py])
+AC_CONFIG_SUBDIRS([lib/cpp lib/php lib/py])
 
 AC_OUTPUT
