Make sure "if <deferred>:" is equivalent to the undeferred case by implementing __non...
[nepi.git] / src / nepi / util / defer.py
1 class Defer:
2     class NONE:
3         pass
4     
5     def __init__(self, ojetwait):
6         self.__ojet = Defer.NONE
7         self.__ojetwait = ojetwait
8     def __getattr__(self, attr):
9         if attr in ('_Defer__ojet', '_Defer__ojetwait', '_get'):
10             try:
11                 return self.__dict__[attr]
12             except KeyError:
13                 raise AttributeError, attr
14         else:
15             if self.__ojet is Defer.NONE:
16                 self.__ojet = self.__ojetwait()
17             return getattr(self.__ojet, attr)
18     def __setattr__(self, attr, value):
19         if attr in ('_Defer__ojet', '_Defer__ojetwait'):
20             self.__dict__[attr] = value
21         else:
22             if self.__ojet is Defer.NONE:
23                 self.__ojet = self.__ojetwait()
24                 self.__ojetwait = None
25             return setattr(self.__ojet, attr, value)
26     def _get(self):
27         if self.__ojet is Defer.NONE:
28             self.__ojet = self.__ojetwait()
29         return self.__ojet
30
31     def __nonzero__(self):
32         return bool(self._get())
33