         get {
             return value[position]
         }
-        set (value) {
-            self.value[position] = value
+        set (item) {
+            let change = ArrayChange.Replace(
+                range: position ..< position + 1,
+                removedElements: [ value[position] ],
+                newElements: [ item ]
+            )
+            
+            notifySubscribersOfChange(change, when: .BeforeChange)
+            mutatingValue = true
+            value[position] = item
+            mutatingValue = false
+            notifySubscribersOfChange(change, when: .AfterChange)
         }
     }
 }

    public typealias ArrayChangeCallback = ([T], ArrayChange<T>) -> Void
    
    private var subscriptions = [ArraySubscription<T>]()
    
    public required init() {
        super.init([])

        let change = determineChange(subRange, newElements: Array(newElements))
        
        notifySubscribersOfChange(change, when: .BeforeChange)
        mutatingValue = true
        value.replaceRange(subRange, with: newElements)
        mutatingValue = false
        notifySubscribersOfChange(change, when: .AfterChange)
    }
    
