summaryrefslogtreecommitdiffstats
path: root/di/core.py
diff options
context:
space:
mode:
Diffstat (limited to 'di/core.py')
-rw-r--r--di/core.py32
1 files changed, 22 insertions, 10 deletions
diff --git a/di/core.py b/di/core.py
index f41d601..0156262 100644
--- a/di/core.py
+++ b/di/core.py
@@ -55,11 +55,14 @@ class DiRegistry(object):
It records the injected objects, handles the execution
and cleanup tasks associated with the DI mechanisms.
"""
+
def __init__(self, obj):
- self._obj = obj
- self._used_objects = {}
- self._obj._di_ = self._used_objects
+ object.__setattr__(self, "_DiRegistry__obj", obj)
+ object.__setattr__(self, "_DiRegistry__used_objects", {})
+ for name in ["__name__", "__module__", "__doc__"]:
+ object.__setattr__(self, name, getattr(obj, name, getattr(self, name)))
+ self.__obj._di_ = self.__used_objects
def __get__(self, obj, objtype):
"""Support instance methods."""
@@ -68,23 +71,32 @@ class DiRegistry(object):
def register(self, *args, **kwargs):
"""Add registered injections to the instance of DiRegistry
"""
- self._used_objects.update(kwargs)
+ self.__used_objects.update(kwargs)
for used_object in args:
if hasattr(used_object, "__name__"):
- self._used_objects[used_object.__name__] = used_object
+ self.__used_objects[used_object.__name__] = used_object
elif isinstance(used_object, basestring):
pass # it is already global, so this is just an annotation
else:
raise ValueError("%s is not a string or object with __name__" % used_object)
def __call__(self, *args, **kwargs):
- if not issubclass(type(self._obj), FunctionType):
+ if not issubclass(type(self.__obj), FunctionType):
# call constructor or callable class
# (which use @usesclassinject if needed)
- return self._obj(*args, **kwargs)
+ return self.__obj(*args, **kwargs)
+ else:
+ return di_call(self.__used_objects, self.__obj,
+ *args, **kwargs)
+
+ def __getattr__(self, name):
+ return getattr(self.__obj, name)
+
+ def __setattr__(self, name, value):
+ if name in self.__dict__:
+ object.__setattr__(self, name, value)
else:
- return di_call(self._used_objects, self._obj,
- *args, **kwargs)
+ setattr(self.__obj, name, value)
def func_globals(func):
"""Helper method that allows access to globals
@@ -133,7 +145,7 @@ def inject(*args, **kwargs):
return obj
if not isinstance(obj, DiRegistry):
- obj = wraps(obj)(DiRegistry(obj))
+ obj = DiRegistry(obj)
obj.register(*args, **kwargs)
return obj