3 class DecoratableObject(object):
\r
4 def __init__(self, fn):
\r
7 def _decorate(self, fn, needs_origin):
\r
8 origin = self._callable
\r
11 self._callable = lambda *args, **kwargs: fn(origin, *args, **kwargs)
\r
13 self._callable = lambda *args, **kwargs: fn(*args, **kwargs)
\r
15 def _decorate_method(self, fn, needs_origin):
\r
16 origin = self._callable
\r
19 self._callable = lambda inst, *args, **kwargs: fn(inst, origin, *args, **kwargs)
\r
21 self._callable = lambda inst, *args, **kwargs: fn(inst, *args, **kwargs)
\r
24 def __call__(self, *args, **kwargs):
\r
25 return self._callable(*args, **kwargs)
\r
28 def _decorate_method(origin, needs_origin):
\r
29 if not hasattr(origin, '_decoratable_obj'):
\r
30 name = origin.__name__
\r
31 cls = origin.im_class
\r
33 decoratable = DecoratableObject(origin)
\r
35 def decoratable_method(self, *args, **kwargs):
\r
36 return decoratable(self, *args, **kwargs)
\r
38 decoratable_method._decoratable_obj = decoratable
\r
39 setattr(cls, name, decoratable_method)
\r
41 decoratable = origin._decoratable_obj
\r
44 decoratable._decorate_method(fn, needs_origin)
\r
48 def _decorate_function(origin, needs_origin):
\r
49 if not isinstance(origin, DecoratableObject):
\r
50 mod = inspect.getmodule(origin)
\r
52 name = origin.__name__
\r
53 origin = DecoratableObject(origin)
\r
54 setattr(mod, name, DecoratableObject(origin))
\r
57 origin._decorate(fn, needs_origin)
\r
62 def decorate(origin, needs_origin=True):
\r
63 if inspect.ismethod(origin):
\r
64 return _decorate_method(origin, needs_origin)
\r
66 if inspect.isfunction(origin):
\r
67 return _decorate_function(origin, needs_origin)