+def _decorate_method(origin, needs_origin, mode):\r
+ if not hasattr(origin, '_decoratable_obj'):\r
+ name = origin.__name__\r
+ cls = origin.im_class\r
+\r
+ decoratable = DecoratableObject(origin)\r
+\r
+ def decoratable_method(self, *args, **kwargs):\r
+ return decoratable(self, *args, **kwargs)\r
+\r
+ decoratable_method._decoratable_obj = decoratable\r
+ setattr(cls, name, decoratable_method)\r
+ else:\r
+ decoratable = origin._decoratable_obj\r
+\r
+ return _create_decorator(decoratable, needs_origin, mode, method=True)\r
+\r
+def _decorate_function(origin, needs_origin, mode):\r
+ if not isinstance(origin, DecoratableObject):\r
+ mod = inspect.getmodule(origin)\r
+\r
+ name = origin.__name__\r
+ origin = DecoratableObject(origin)\r
+ setattr(mod, name, origin)\r
+\r
+ return _create_decorator(origin, needs_origin, mode)\r
+\r
+\r
+def decorate(origin, needs_origin=True, mode=DecoratableObject.MODE_OVERRIDE):\r
+ if inspect.ismethod(origin):\r
+ return _decorate_method(origin, needs_origin, mode)\r
+\r
+ if inspect.isfunction(origin) or isinstance(origin, DecoratableObject):\r
+ return _decorate_function(origin, needs_origin, mode)\r
+\r
+ def decorator(fn):\r
+ return fn\r