 // MARK: Array Bond
 
 public class ArrayBond<T>: Bond<Array<T>> {
-  public var insertListener: (([Int]) -> Void)?
-  public var removeListener: (([Int], [T]) -> Void)?
-  public var updateListener: (([Int]) -> Void)?
+  public var insertListener: ((DynamicArray<T>, [Int]) -> Void)?
+  public var removeListener: ((DynamicArray<T>, [Int], [T]) -> Void)?
+  public var updateListener: ((DynamicArray<T>, [Int]) -> Void)?
   
   override public init() {
     super.init()
   }
   
-  public init(insertListener: (([Int]) -> Void)?, removeListener: (([Int], [T]) -> Void)?, updateListener: (([Int]) -> Void)?) {
+  public init(
+    insertListener: ((DynamicArray<T>, [Int]) -> Void)?,
+    removeListener: ((DynamicArray<T>, [Int], [T]) -> Void)?,
+    updateListener: ((DynamicArray<T>, [Int]) -> Void)?) {
+      
     self.insertListener = insertListener
     self.removeListener = removeListener
     self.updateListener = updateListener

  private func dispatchRemoval(indices: [Int], objects: [T]) {
    for bondBox in bonds {
      if let arrayBond = bondBox.bond as? ArrayBond {
        arrayBond.removeListener?(indices, objects)
      }
    }
  }

      }
    }
    
    bond.updateListener = { [unowned self] array, indices in
      
      var mappedIndices: [Int] = []
      var mappedInsertionIndices: [Int] = []
