]> git.openstreetmap.org Git - osqa.git/blob - forum/modules/decorators.py
Converts the welcome message to the new mail system and makes some changes to the...
[osqa.git] / forum / modules / decorators.py
1 import inspect\r
2 \r
3 class DecoratableObject(object):\r
4     def __init__(self, fn):\r
5         self._callable = fn\r
6 \r
7     def decorate(self, fn, needs_origin):\r
8         origin = self._callable\r
9 \r
10         if needs_origin:\r
11             self._callable = lambda *args, **kwargs: fn(origin, *args, **kwargs)\r
12         else:\r
13             self._callable = lambda *args, **kwargs: fn(*args, **kwargs)\r
14 \r
15     def __call__(self, *args, **kwargs):\r
16         return self._callable(*args, **kwargs)\r
17 \r
18 \r
19 def decoratable(fn):\r
20     return DecoratableObject(fn)\r
21 \r
22 def decoratable_method(fn):\r
23     obj = DecoratableObject(fn)\r
24     def decorated(self, *args, **kwargs):\r
25         return obj(self, *args, **kwargs)\r
26 \r
27     decorated.__obj = obj\r
28     return decorated\r
29 \r
30 decoratable.method = decoratable_method\r
31 \r
32 def decorate(origin, needs_origin=True):\r
33     if not isinstance(origin, DecoratableObject):\r
34         if hasattr(origin, '__obj'):\r
35             def decorator(fn):\r
36                 origin.__obj.decorate(fn, needs_origin)\r
37                 return origin\r
38             return decorator\r
39 \r
40         raise TypeError('Not a decoratable function: %s' % origin.__name__)\r
41 \r
42     def decorator(fn):\r
43         origin.decorate(fn, needs_origin)\r
44         return origin\r
45 \r
46     return decorator\r
47 \r
48 \r
49 def decorate_all(module):\r
50     [setattr(module, n, decoratable(f)) for n, f in\r
51         [(n, getattr(module, n)) for n in dir(module)]\r
52         if (callable(f)) and (not inspect.isclass(f)) and (f.__module__ == module.__name__)]\r
53 \r
54 \r
55 \r
56 \r
57 \r
58 \r
59 \r