     ///
     /// Calls a function any time this value is marked as changed
     ///
-    func whenChanged(what: Notifiable) -> Lifetime;
+    func whenChanged(target: Notifiable) -> Lifetime;
+}
+
+///
+/// Wrapper that can be used to determine whether or not a particular notification target still exists
+///
+private class NotificationWrapper {
+    private var target : Notifiable?;
+    
+    init(target: Notifiable) {
+        self.target = target;
+    }
 }
 
 ///

    ///
    /// Calls a function any time this value is marked as changed
    ///
    public final func whenChanged(action: Notifiable) -> Lifetime {
        // Record this action so we can re-run it when the value changes
        let thisActionId = _nextActionId;
        _nextActionId += 1;
        _actionsOnChanged.append((thisActionId, action));
        
        // Stop observing the action once the lifetime expires
        return CallbackLifetime(done: {
            let index = self._actionsOnChanged.indexOf({ (id, _) in return id == thisActionId; });
            if let index = index {
                self._actionsOnChanged.removeAtIndex(index);
            }
        });
    }


    ///
    /// The actions that should be executed when this bound value is changed
    ///
    private var _actionsOnChanged: [NotificationWrapper] = [];
    
    ///
    /// Must be overridden by subclasses: can't be initialised directly
