pyloxi: use the ofclass subtemplate for messages

The only difference was the special case for the default XID.
diff --git a/py_gen/templates/_ofclass.py b/py_gen/templates/_ofclass.py
index 695cce6..6116c78 100644
--- a/py_gen/templates/_ofclass.py
+++ b/py_gen/templates/_ofclass.py
@@ -11,7 +11,12 @@
         if ${m.name} != None:
             self.${m.name} = ${m.name}
         else:
+:: if m.name == 'xid':
+:: # HACK for message xid
+            self.${m.name} = None
+:: else:
             self.${m.name} = ${py_gen.oftype.gen_init_expr(m.oftype, version=version)}
+:: #endif
 :: #endfor
         return
 
diff --git a/py_gen/templates/message.py b/py_gen/templates/message.py
index 39e9722..b781bc1 100644
--- a/py_gen/templates/message.py
+++ b/py_gen/templates/message.py
@@ -54,56 +54,7 @@
     xid = None
 
 :: for ofclass in ofclasses:
-:: from loxi_ir import *
-:: normal_members = [m for m in ofclass.members if type(m) == OFDataMember]
-:: type_members = [m for m in ofclass.members if type(m) == OFTypeMember]
-class ${ofclass.pyname}(Message):
-:: for m in type_members:
-    ${m.name} = ${m.value}
-:: #endfor
-
-    def __init__(self, ${', '.join(["%s=None" % m.name for m in normal_members])}):
-        self.xid = xid
-:: for m in [x for x in normal_members if x.name != 'xid']:
-        if ${m.name} != None:
-            self.${m.name} = ${m.name}
-        else:
-            self.${m.name} = ${py_gen.oftype.gen_init_expr(m.oftype, version=version)}
-:: #endfor
-
-    def pack(self):
-        packed = []
-:: include('_pack.py', ofclass=ofclass, version=version)
-        return ''.join(packed)
-
-    @staticmethod
-    def unpack(buf):
-        if len(buf) < 8: raise loxi.ProtocolError("buffer too short to contain an OpenFlow message")
-        obj = ${ofclass.pyname}()
-:: include('_unpack.py', ofclass=ofclass, version=version)
-        return obj
-
-    def __eq__(self, other):
-        if type(self) != type(other): return False
-        if self.version != other.version: return False
-        if self.type != other.type: return False
-:: for m in normal_members:
-        if self.${m.name} != other.${m.name}: return False
-:: #endfor
-        return True
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-    def __str__(self):
-        return self.show()
-
-    def show(self):
-        import loxi.pp
-        return loxi.pp.pp(self)
-
-    def pretty_print(self, q):
-:: include('_pretty_print.py', ofclass=ofclass)
+:: include('_ofclass.py', ofclass=ofclass, superclass="Message")
 
 :: #endfor
 
diff --git a/py_gen/tests/of10.py b/py_gen/tests/of10.py
index be93239..c4725e3 100644
--- a/py_gen/tests/of10.py
+++ b/py_gen/tests/of10.py
@@ -152,7 +152,7 @@
 
     def test_echo_request_invalid_length(self):
         buf = "\x01\x02\x00\x07\x12\x34\x56"
-        with self.assertRaisesRegexp(ofp.ProtocolError, "buffer too short"):
+        with self.assertRaisesRegexp(ofp.ProtocolError, "Buffer too short"):
             ofp.message.echo_request.unpack(buf)
 
     def test_echo_request_equality(self):