     public typealias ArrayChangeCallback = ([T], ArrayChange<T>) -> Void
     
     private var subscriptions = [ArraySubscription<T>]()
+    
+    private var mutatingValue = false
+    
+    public override var value: [T] {
+        willSet (newValue) {
+            if mutatingValue {
+                return
+            }
+            
+            let oldValue = value
+            let change = ArrayChange.Replace(range: oldValue.startIndex ..< oldValue.endIndex, removedElements: oldValue, newElements: newValue)
+            notifySubscribersOfChange(change, when: .BeforeChange)
+        }
+        didSet (oldValue) {
+            if mutatingValue {
+                return
+            }
+            
+            let newValue = value
+            let change = ArrayChange.Replace(range: oldValue.startIndex ..< oldValue.endIndex, removedElements: oldValue, newElements: newValue)
+            notifySubscribersOfChange(change, when: .AfterChange)
+        }
+    }
     
     public required init() {
         super.init([])

        get {
            return value[position]
        }
        set (value) {
            self.value[position] = value
        }
    }
}

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