summaryrefslogtreecommitdiff
path: root/Lib/idlelib/delegator.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/idlelib/delegator.py')
-rw-r--r--Lib/idlelib/delegator.py33
1 files changed, 33 insertions, 0 deletions
diff --git a/Lib/idlelib/delegator.py b/Lib/idlelib/delegator.py
new file mode 100644
index 0000000000..dc2a1aaeea
--- /dev/null
+++ b/Lib/idlelib/delegator.py
@@ -0,0 +1,33 @@
+class Delegator:
+
+ def __init__(self, delegate=None):
+ self.delegate = delegate
+ self.__cache = set()
+ # Cache is used to only remove added attributes
+ # when changing the delegate.
+
+ def __getattr__(self, name):
+ attr = getattr(self.delegate, name) # May raise AttributeError
+ setattr(self, name, attr)
+ self.__cache.add(name)
+ return attr
+
+ def resetcache(self):
+ "Removes added attributes while leaving original attributes."
+ # Function is really about resetting delagator dict
+ # to original state. Cache is just a means
+ for key in self.__cache:
+ try:
+ delattr(self, key)
+ except AttributeError:
+ pass
+ self.__cache.clear()
+
+ def setdelegate(self, delegate):
+ "Reset attributes and change delegate."
+ self.resetcache()
+ self.delegate = delegate
+
+if __name__ == '__main__':
+ from unittest import main
+ main('idlelib.idle_test.test_delegator', verbosity=2)