 +        if isinstance(value, instance):
 +            instance._parent = value
 +
-+        self._value = value
++        if value is not None:
++            self._value = Proxy(value)
 +
 +        def notify(o, v):
 +            if not isinstance(v, Result) and v is not None:

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,150 @@
 
         super(ValueChanged, self).__init__(value)
 

-diff --git a/tmp/lazy_evaluation.diff b/tmp/lazy_evaluation.diff
---- a/tmp/lazy_evaluation.diff
-+++ b/tmp/lazy_evaluation.diff
-@@ -48,66 +48,66 @@
- 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 @@
-+@@ -22,11 +22,150 @@
-  
-          super(ValueChanged, self).__init__(value)
-  
- +class Proxy(object):
- +
--+    __slots__ = ["_obj", "__weakref__"]
-++    __slots__ = ["_obj", "_result", "__weakref__"]
- +
--+    def __init__(self, obj):
-++    def __init__(self, obj, result=None):
- +        object.__setattr__(self, "_obj", obj)
-++        object.__setattr__(self, "_result", result)
- +
--+    # proxying (special cases)
- +    #
-++    # 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 Methods
- +    #
--+    _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",
-++
-++    _special_methods = [
-++        "__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"""
-++        """Creates a proxy for the given class"""
- +        
- +        def make_method(name):
- +            def method(self, *fargs, **fkwargs):
-@@ -124,20 +124,22 @@
- +                    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 
-@@ -145,18 +147,11 @@
- +        note: _class_proxy_cache is unique per deriving class (each deriving
- +        class must hold its own cache)
- +        """
--+        try:
--+            cache = cls.__dict__["_class_proxy_cache"]
--+        except KeyError:
--+            cls._class_proxy_cache = cache = {}
--+        try:
--+            theclass = cache[obj.__class__]
--+        except KeyError:
--+            cache[obj.__class__] = theclass = cls._create_class_proxy(
--+                    obj.__class__)
--+        ins = object.__new__(theclass)
--+        theclass.__init__(ins, obj, *args, **kwargs)
--+        return ins
-++
-++        theclass = cls._create_class_proxy(obj.__class__)
-++        self = object.__new__(theclass)
-++        theclass.__init__(self, obj, *args, **kwargs)
-++        return self
-  
-  class Value(object):
- -    """Create a new future Value Object
-@@ -179,8 +174,25 @@
- +        print(instance)
- +        print(value)
- +
--+        instance.done = True
--+        self._value = Proxy(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
-@@ -189,7 +201,7 @@
-      Manager to store the result(s) of an Event Handler's exeuction of some
-      Event in the system.
-  
--@@ -39,90 +166,31 @@
-+@@ -39,90 +178,33 @@
-      :param onSet: The channel used when triggering ValueChagned events.
-      :type  onSet: A (channel, target) tuple.
-  
-@@ -218,481 +230,8 @@
-          self.errors = False
- -        self._parent = self
- -        self._value = None
-++
-++        self._parent = None
-  
-      def __getstate__(self):
---        keys = ("event", "onSet", "result", "errors", "_value")
--+        keys = ("event", "onSet", "done", "errors", "value")
--         return dict([(k, getattr(self, k, None)) for k in keys])
-- 
---    def __contains__(self, y):
---        value = self.value
---        return y in value if isinstance(value, list) else y == value
---
---    def __getitem__(self, y):
---        v = self.value[y]
---        if isinstance(v, Value):
---            return v.value
