initial version
diff --git a/Tools/bgen/bgen/bgenObjectDefinition.py b/Tools/bgen/bgen/bgenObjectDefinition.py
new file mode 100644
index 0000000..6573fd4
--- /dev/null
+++ b/Tools/bgen/bgen/bgenObjectDefinition.py
@@ -0,0 +1,130 @@
+from bgenOutput import *
+from bgenGeneratorGroup import GeneratorGroup
+
+class ObjectDefinition(GeneratorGroup):
+
+	def __init__(self, name, prefix, itselftype):
+		import string
+		GeneratorGroup.__init__(self, prefix or name)
+		self.name = name
+		self.itselftype = itselftype
+		self.objecttype = name + 'Object'
+		self.typename = self.prefix + '_' + \
+				string.upper(name[:1]) + \
+		                string.lower(name[1:]) + '_Type'
+
+	def add(self, g):
+		g.setselftype(self.objecttype, self.itselftype)
+		GeneratorGroup.add(self, g)
+
+	def reference(self):
+		# In case we are referenced from a module
+		pass
+
+	def generate(self):
+		# XXX This should use long strings and %(varname)s substitution!
+
+		OutHeader2("Object type " + self.name)
+
+		Output("staticforward PyTypeObject %s;", self.typename)
+		Output()
+
+		Output("#define is_%sobject(x) ((x)->ob_type == %s)",
+		       self.name, self.typename)
+		Output()
+
+		Output("typedef struct {")
+		IndentLevel()
+		Output("OB_HEAD")
+		Output("%s ob_itself;", self.itselftype)
+		DedentLevel()
+		Output("} %s;", self.objecttype)
+		Output()
+
+		Output("static %s *new%s(itself)", self.objecttype, self.objecttype)
+		IndentLevel()
+		Output("%s itself;", self.itselftype)
+		DedentLevel()
+		OutLbrace()
+		Output("%s *it;", self.objecttype)
+		Output("it = PyObject_NEW(%s, &%s);", self.objecttype, self.typename)
+		Output("if (it == NULL) return NULL;")
+		Output("it->ob_itself = itself;")
+		Output("return it;")
+		OutRbrace()
+		Output()
+
+		Output("static void %s_dealloc(self)", self.prefix)
+		IndentLevel()
+		Output("%s *self;", self.objecttype)
+		DedentLevel()
+		OutLbrace()
+##		Output("if (self->ob_itself != NULL)")
+##		OutLbrace()
+##		self.outputFreeIt("self->ob_itself")
+##		OutRbrace()
+		Output("DEL(self);")
+		OutRbrace()
+		Output()
+
+##		Output("static int %s_converter(p_itself, p_it)", self.prefix)
+##		IndentLevel()
+##		Output("%s *p_itself;", self.itselftype)
+##		Output("%s **p_it;", self.objecttype)
+##		DedentLevel()
+##		OutLbrace()
+##		Output("if (**p_it == NULL)")
+##		OutLbrace()
+##		Output("*p_it = new%s(*p_itself);", self.objecttype)
+##		OutRbrace()
+##		Output("else")
+##		OutLbrace()
+##		Output("*p_itself = (*p_it)->ob_itself;")
+##		OutRbrace()
+##		Output("return 1;")
+##		OutRbrace()
+##		Output()
+
+		GeneratorGroup.generate(self)
+
+		self.outputGetattr()
+
+		self.outputSetattr()
+
+		Output("static PyTypeObject %s = {", self.typename)
+		IndentLevel()
+		Output("PyObject_HEAD_INIT(&PyType_Type)")
+		Output("0, /*ob_size*/")
+		Output("\"%s\", /*tp_name*/", self.name)
+		Output("sizeof(%s), /*tp_basicsize*/", self.objecttype)
+		Output("0, /*tp_itemsize*/")
+		Output("/* methods */")
+		Output("(destructor) %s_dealloc, /*tp_dealloc*/", self.prefix)
+		Output("0, /*tp_print*/")
+		Output("(getattrfunc) %s_getattr, /*tp_getattr*/", self.prefix)
+		Output("(setattrfunc) %s_setattr, /*tp_setattr*/", self.prefix)
+		DedentLevel()
+		Output("};")
+
+		OutHeader2("End object type " + self.name)
+
+	def outputFreeIt(self, name):
+		Output("DEL(%s); /* XXX */", name)
+
+	def outputGetattr(self):
+		Output("static PyObject *%s_getattr(self, name)", self.prefix)
+		IndentLevel()
+		Output("%s *self;", self.objecttype)
+		Output("char *name;")
+		DedentLevel()
+		OutLbrace()
+		self.outputGetattrBody()
+		OutRbrace()
+		Output()
+
+	def outputGetattrBody(self):
+		Output("return findmethod(self, %s_methods, name);", self.prefix)
+
+	def outputSetattr(self):
+		Output("#define %s_setattr NULL", self.prefix)
+		Output()