 +                    else:
 +                        kwargs[k] = v
 +
-+                print(self, name, args, kwargs)
++                result = object.__getattribute__(self, "_result")
++                if result is not None:
++                    manager()
 +
 +                return getattr(object.__getattribute__(self, "_obj"),
 +                        name)(*args, **kwargs)
 +            return method
 +        
 +        namespace = {}
-+        for name in cls._special_names:
-+            if hasattr(theclass, name):
-+                namespace[name] = make_method(name)
++        for method in cls._special_methods:
++            if hasattr(theclass, method):
++                namespace[method] = make_method(method)
 +        return type("%s(%s)" % (cls.__name__, theclass.__name__), (cls,),
 +                namespace)
 +    
-+    def __new__(cls, obj, *args, **kwargs):
++    def __new__(cls, obj, manager=None, *args, **kwargs):
 +        """
 +        creates an proxy instance referencing `obj`. (obj, *args, **kwargs) are
 +        passed to this class" __init__, so deriving classes can define an 

diff --git a/circuits/core/values.py b/circuits/core/values.py
--- a/circuits/core/values.py
+++ b/circuits/core/values.py
@@ -22,11 +22,138 @@
 
         super(ValueChanged, self).__init__(value)
 
+class Proxy(object):
+
+    __slots__ = ["_obj", "__weakref__"]
+
+    def __init__(self, obj):
+        object.__setattr__(self, "_obj", obj)
+
+    # proxying (special cases)
+    #
+    def __getattribute__(self, name):
+        print("__getattribute__")
+        print(name)
+        return getattr(object.__getattribute__(self, "_obj"), name)
+    def __delattr__(self, name):
+        print("__delattr__")
+        print(name)
+        delattr(object.__getattribute__(self, "_obj"), name)
+    def __setattr__(self, name, value):
+        print("__setattr__")
+        print(name)
+        print(value)
+        setattr(object.__getattribute__(self, "_obj"), name, value)
+
+    def __nonzero__(self):
+        print("__nonzero__")
+        return bool(object.__getattribute__(self, "_obj"))
+    def __str__(self):
+        print("__str__")
+        return str(object.__getattribute__(self, "_obj"))
+    def __repr__(self):
+        print("__repr__")
+        return repr(object.__getattribute__(self, "_obj"))
+
+    #
+    # factories
+    #
+    _special_names = [
+        "__abs__", "__add__", "__and__", "__call__", "__cmp__", "__coerce__", 
+        "__contains__", "__delitem__", "__delslice__", "__div__", "__divmod__", 
+        "__eq__", "__float__", "__floordiv__", "__ge__", "__getitem__", 
+        "__getslice__", "__gt__", "__hash__", "__hex__", "__iadd__", "__iand__",
+        "__idiv__", "__idivmod__", "__ifloordiv__", "__ilshift__", "__imod__", 
+        "__imul__", "__int__", "__invert__", "__ior__", "__ipow__", "__irshift__", 
+        "__isub__", "__iter__", "__itruediv__", "__ixor__", "__le__", "__len__", 
+        "__long__", "__lshift__", "__lt__", "__mod__", "__mul__", "__ne__", 
+        "__neg__", "__oct__", "__or__", "__pos__", "__pow__", "__radd__", 
+        "__rand__", "__rdiv__", "__rdivmod__", "__reduce__", "__reduce_ex__", 
+        "__repr__", "__reversed__", "__rfloorfiv__", "__rlshift__", "__rmod__", 
+        "__rmul__", "__ror__", "__rpow__", "__rrshift__", "__rshift__", "__rsub__", 
+        "__rtruediv__", "__rxor__", "__setitem__", "__setslice__", "__sub__", 
+        "__truediv__", "__xor__", "next",
+    ]
+    
+    @classmethod
+    def _create_class_proxy(cls, theclass):
+        """creates a proxy for the given class"""
+        
+        def make_method(name):
+            def method(self, *fargs, **fkwargs):

+        print(instance)
+        print(value)
+
+        if isinstance(value, instance):
+            instance._parent = value
+
+        self._value = value
+
+        def notify(o, v):
+            if not isinstance(v, Result) and v is not None:
+                o.done = True
+                if o.manager is not None and o.onSet is not None:
+                    o.manager.fireEvent(ValueChanged(o), *o.onSet)
+            elif isinstance(v, Result):
+                o.done = v.done
+                o.errors = v.errors
+            if not o._parent == o:
+                o._parent.done = o.done
+                o._parent.errors = o.errors
+                notify(o._parent, v)
+        
+        notify(self, value)
+
+class Result(object):
+    """Create a new Result Object
