+ tx.postcommit(lambda: self.store.icache.__setitem__((obj, self), val))
+
+ def loaded(self, id, obj, tx):
+ val = tuple(part.__get__(obj, None) for part in self.parts)
+ tx.postcommit(lambda: self.store.icache.__setitem__((obj, self), val))
+
+class idlink(object):
+ def __init__(self, name, atype):
+ self.atype = atype
+ self.battr = "__idlink_%s" % name
+
+ def __get__(self, obj, cls):
+ if obj is None: return self
+ ret = self.atype.store.get(getattr(obj, self.battr))
+ assert isinstance(ret, self.atype)
+ return ret
+
+ def __set__(self, obj, val):
+ assert isinstance(val, self.atype)
+ setattr(obj, self.battr, val.id)
+
+ def __delete__(self, obj):
+ delattr(obj, self.battr)