Index: trunk/packages/invirt-database/debian/changelog
===================================================================
--- trunk/packages/invirt-database/debian/changelog	(revision 2191)
+++ trunk/packages/invirt-database/debian/changelog	(revision 2192)
@@ -7,6 +7,8 @@
   * use self.c rather than self.__dict__ for SQLAlchemy fields
   * make Record._ignore, Owner.get* classmethods
-
- -- Greg Price <price@mit.edu>  Thu, 26 Feb 2009 22:38:02 -0500
+  * fold FormattableRecord, NullableRecord into Record
+  * shorten types in lists to __name__
+
+ -- Greg Price <price@mit.edu>  Thu, 26 Feb 2009 22:51:43 -0500
 
 invirt-database (0.1.7) unstable; urgency=low
Index: trunk/packages/invirt-database/python/database/owner.py
===================================================================
--- trunk/packages/invirt-database/python/database/owner.py	(revision 2191)
+++ trunk/packages/invirt-database/python/database/owner.py	(revision 2192)
@@ -1,5 +1,5 @@
-from record import NullableRecord
+from record import Record
 
-class Owner(NullableRecord):
+class Owner(Record):
     _f = {
         'ram_quota_total': (512, 'MiB'),
Index: trunk/packages/invirt-database/python/database/record.py
===================================================================
--- trunk/packages/invirt-database/python/database/record.py	(revision 2191)
+++ trunk/packages/invirt-database/python/database/record.py	(revision 2192)
@@ -1,22 +1,25 @@
 class Record(object):
     _identity_field = None
+    _default = {}
+    _format = {}
 
     def get(self, field):
-        try:
-            return self.__getattribute__(field)
-        except:
-            return None
+        v = getattr(self, field, None)
+        if v is None:
+            return self._default.get(field)
+        return v
 
     def _formatField(self, field):
         v = self.get(field)
+        func = self._format.get(field)
+        if func:
+            return func(v)
         if callable(v):
             v = v()
-        if hasattr(v, '__iter__'):
-            if len(v) == 0:
-                return '[]'
-            else:
-                return '[%d x %s]'%(len(v), type(v[0]))
-        else:
+        if not hasattr(v, '__iter__'):
             return repr(v)
+        if len(v) == 0:
+            return '[]'
+        return '[%d x %s]'%(len(v), type(v[0]).__name__)
 
     @classmethod
@@ -43,20 +46,2 @@
 
         return "<%s%s%s>" % (classname, identity, payload)
-
-class FormattableRecord(Record):
-    _format = {}
-    def _formatField(self, field):
-        func = self._format.get(field)
-        if func:
-            return func(self.get(field))
-        else:
-            return super(FormattableRecord, self)._formatField(field)
-
-class NullableRecord(FormattableRecord):
-    _default = {}
-    def get(self, field):
-        v = self.__dict__.get(field)
-        if v != None:
-            return v
-        else:
-            return self._default.get(field)
