| class Delegator: | |
| # The cache is only used to be able to change delegates! | |
| def __init__(self, delegate=None): | |
| self.delegate = delegate | |
| self.__cache = {} | |
| def __getattr__(self, name): | |
| attr = getattr(self.delegate, name) # May raise AttributeError | |
| setattr(self, name, attr) | |
| self.__cache[name] = attr | |
| return attr | |
| def resetcache(self): | |
| for key in self.__cache.keys(): | |
| try: | |
| delattr(self, key) | |
| except AttributeError: | |
| pass | |
| self.__cache.clear() | |
| def cachereport(self): | |
| keys = self.__cache.keys() | |
| keys.sort() | |
| print keys | |
| def setdelegate(self, delegate): | |
| self.resetcache() | |
| self.delegate = delegate | |
| def getdelegate(self): | |
| return self.delegate |