]> asedeno.scripts.mit.edu Git - bluechips.git/blobdiff - bluechips/lib/subclass.py
Make Currency objects (and others using the SuperSubclass) immutable
[bluechips.git] / bluechips / lib / subclass.py
index 3511d8e382dd7911aeefd5b13fd6b87e82f4cbe7..57ea48883f5c968641e64b449dd6720b900adfb5 100644 (file)
@@ -3,14 +3,26 @@ Create subclasses that call out to their "superclass" for all methods
 but return the "subclass's" type
 """
 
+from weakref import WeakValueDictionary
+
 def wrapper(c, func):
     return (lambda self,*args: c(getattr(self.value, func)(*map(self.value.__class__, args))))
 
+def __new__(cls, value=0):
+    if value not in cls.__old_values__:
+        new_object = super(cls, cls).__new__(cls, value)
+        cls.__old_values__[value] = new_object
+        return new_object
+    else:
+        return cls.__old_values__[value]
+
 class SmartSubclass(object):
     def __init__(self, superclass, exclude=[]):
         self.superclass = superclass
         self.exclude = exclude
     def __call__(self, name, bases, dict):
+        dict['__old_values__'] = WeakValueDictionary()
+        dict['__new__'] = __new__
         c = type(name, bases, dict)
         for func in dir(self.superclass):
             if func not in dir(c) and \