 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__"]
-+
-+    def __init__(self, obj):
++    __slots__ = ["_obj", "_result", "__weakref__"]
++
++    def __init__(self, obj, result=None):
 +        object.__setattr__(self, "_obj", obj)
-+
-+    # proxying (special cases)
++        object.__setattr__(self, "_result", result)
++
 +    #
++    # 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):

         self.errors = False
-        self._parent = self
-        self._value = None
 
     def __getstate__(self):
-        keys = ("event", "onSet", "result", "errors", "_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
