--- /dev/null
+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'],
+      scripts = ['src/thrift']
+      )
+
 
 import os
 import os.path
 from string import Template
-from parser import *
-from generator import *
+from thrift.parser import *
+from thrift.generator import *
 
 HEADER_COMMENT = """/**
  * Autogenerated by Thrift
        
        result+= toServerFunctionDefinition(service.name, function, debugp)
     
-    callProcessSwitch = "        if"+string.join(["(name.compare(\""+function.name+"\") == 0) { process_"+function.name+"(seqid, itrans, otrans);\n}" for function in service.functionList], "\n        else if")+" else {throw "+CPP_EXCEPTION+"(\"Unknown function name \\\"\"+name+\"\\\"\");}"
+    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)
 
 
+#!python
 import sys
-import generator
-import cpp_generator
-import parser
+from thrift import cpp_generator
+from thrift import generator
+from thrift import parser
 
-if __name__ == '__main__':
-
-    args = sys.argv[1:]
+def thrift(source, cpp=False, perl=False, php=False, python=False, java=False, ruby=False, debug=False):
 
     generators = []
 
+    if cpp:
+       generators.append(cpp_generator.CPPGenerator())
+    
+    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:
-       generators.append(cpp_generator.CPPGenerator())
+       cpp = True
        args.remove("--cpp")
     if "--debug" in args:
        debug = True
 
     filename = args[-1]
 
-    p = parser.Parser(debug=debug)
-
-    p.parse(filename, False)
+    result = thrift(filename, cpp, java, perl, php, python, ruby, debug)
 
-    if len(p.errors):
-       sys.exit(-1)
+    sys.exit(result)
 
-    [g(p.program, filename) for g in generators]
+if __name__ == '__main__':
+    main(sys.argv)