]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
the ultimate "hands off" approach to the object's dictionary of managed attributes
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 6 Apr 2006 14:27:03 +0000 (14:27 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 6 Apr 2006 14:27:03 +0000 (14:27 +0000)
lib/sqlalchemy/attributes.py

index 6424c9d7938c00f0e08074bff33fea44dd8958ee..1a399159e7d6088033ff73f4a8c8b137cfc914a7 100644 (file)
@@ -78,9 +78,10 @@ class ManagedAttribute(object):
     which occurs through the SmartProperty property object ultimately calls upon 
     ManagedAttribute objects associated with the instance via this dictionary."""
     def __init__(self, obj, key):
-        self.__obj = weakref.ref(obj)
+        #self.__obj = weakref.ref(obj)
+        self.obj = obj
         self.key = key
-    obj = property(lambda s:s.__obj())
+    #obj = property(lambda s:s.__obj())
     def history(self, **kwargs):
         return self
     def plain_init(self, *args, **kwargs):
@@ -493,6 +494,27 @@ class AttributeManager(object):
         the new object instance as an argument to create the new ManagedAttribute.  
         Extra keyword arguments can be sent which
         will be passed along to newly created ManagedAttribute."""
-        class_._attribute_manager = self
+        if not hasattr(class_, '_attribute_manager'):
+            class_._attribute_manager = self
+            class_._managed_attributes = ObjectAttributeGateway()
         setattr(class_, key, self.create_prop(class_, key, uselist, callable_, **kwargs))
 
+managed_attributes = weakref.WeakKeyDictionary()
+
+class ObjectAttributeGateway(object):
+    """handles the dictionary of ManagedAttributes for instances.  this level of indirection
+    is to prevent circular references upon objects, as well as keeping them Pickle-compatible."""
+    def __set__(self, obj, value):
+        managed_attributes[obj] = value
+    def __delete__(self, obj):
+        try:
+            del managed_attributes[obj]
+        except KeyError:
+            raise AttributeError()
+    def __get__(self, obj, owner):
+        if obj is None:
+            return self
+        try:
+            return managed_attributes[obj]
+        except KeyError:
+            raise AttributeError()
\ No newline at end of file