     public func add(
         observer: AnyObject,
         onDidInsert: DidInsert? = nil,
+        onDidUpdate: DidUpdate? = nil,
         onDidRemove: DidRemove? = nil,
         onDidRemoveAll: DidRemoveAll? = nil,
         onDidMove: DidMove? = nil
         )
     {
-        guard onDidInsert != nil || onDidRemove != nil || onDidRemoveAll != nil else {
+        guard onDidInsert != nil || onDidRemove != nil || onDidMove != nil || onDidRemoveAll != nil else {
             return
         }
 
         let handlers: ObservationHandlers = (
             insert: onDidInsert,
+            update: onDidUpdate,
             remove: onDidRemove,
             removeAll: onDidRemoveAll,
             didMove: onDidMove

        self.values.insert(element, at: index)
        self.executeWithAllHandlers({ handler in
            handler.insert?(element, index)
        })
    }


public final class ObservableArray<Element> {
    public typealias DidInsert = (Element, _ at: Int) -> ()
    public typealias DidRemove = (Element, _ at: Int) -> ()
    public typealias DidUpdate = (Element, _ at: Int) -> ()
    public typealias DidRemoveAll = (_ oldValues: [Element]) -> ()
    public typealias DidMove = (Element, _ from: Int, _ to: Int) -> ()
    public typealias ObservationHandlers = (insert: DidInsert?, update: DidUpdate?, remove: DidRemove?, removeAll: DidRemoveAll?, didMove: DidMove?)

    fileprivate var observers: [(observer: WeakWrapper<AnyObject>, handlers: [ObservationHandlers])] = []
    fileprivate var onHasObserversChanged: ((Bool) -> ())?
