     ///
     /// The actions that should be executed when this bound value is changed
     ///
-    private var _actionsOnChanged: [(Int, Notifiable)] = [];
-    
-    ///
-    /// Next ID to assign to an action
-    ///
-    private var _nextActionId = 0;
+    private var _actionsOnChanged: [NotificationWrapper] = [];
     
     ///
     /// Must be overridden by subclasses: can't be initialised directly

    ///
    /// Calls a function any time this value is marked as changed
    ///
    func whenChanged(what: Notifiable) -> Lifetime;
}

///

    /// Causes any observers to be notified that this object has changed
    ///
    internal final func notifyChange() {
        var needToTidy = false;
        
        // Run any actions that result from this value being updated
        for notificationWrapper in _actionsOnChanged {
            if let action = notificationWrapper.target {
                action.markAsChanged();
            } else {
                needToTidy = true;
            }
        }
        
        if needToTidy {
            _actionsOnChanged = _actionsOnChanged.filter { notificationWrapper in
                return notificationWrapper.target != nil
            };
            
            
        }
    }
    
