+
+def cached(f):
+ name = f.__name__
+ def wrapper(self):
+ cache = self.cache
+ if cache is None:
+ return f(self)
+ if name not in cache:
+ cache[name] = (True, f(self))
+ return cache[name][1]
+ return wrapper
+
+class ElementError(Exception):
+ def __init__(self, message):
+ self.msg = message
+
+ def __str__(self):
+ return self.msg
+