     self.didInsertListener = { [weak self] array, i in
       if let s = self {
         if let tableView: UITableView = self?.tableView {
-          tableView.beginUpdates()
-          tableView.insertSections(NSIndexSet(array: i), withRowAnimation: UITableViewRowAnimation.Automatic)
-          
-          for section in sorted(i, <) {
-            let sectionBond = UITableViewDataSourceSectionBond<Void>(tableView: tableView, section: section)
-            let sectionDynamic = array[section]
-            sectionDynamic.bindTo(sectionBond)
-            s.sectionBonds.insert(sectionBond, atIndex: section)
-            
-            for var idx = section + 1; idx < s.sectionBonds.count; idx++ {
-              s.sectionBonds[idx].section += 1
+          perform(animated: !s.disableAnimation) {
+            tableView.beginUpdates()
+            tableView.insertSections(NSIndexSet(array: i), withRowAnimation: UITableViewRowAnimation.Automatic)
+            
+            for section in sorted(i, <) {
+              let sectionBond = UITableViewDataSourceSectionBond<Void>(tableView: tableView, section: section)
+              let sectionDynamic = array[section]
+              sectionDynamic.bindTo(sectionBond)
+              s.sectionBonds.insert(sectionBond, atIndex: section)
+              
+              for var idx = section + 1; idx < s.sectionBonds.count; idx++ {
+                s.sectionBonds[idx].section += 1
+              }
             }
+            
+            tableView.endUpdates()
           }
-          
-          tableView.endUpdates()
         }
       }
     }

  }
}

public func ->> <T>(left: DynamicArray<UITableViewCell>, right: UITableViewDataSourceBond<T>) {
  right.bind(left)
}

    self.didRemoveListener = { [weak self] array, i in
      if let s = self {
        if let tableView = s.tableView {
          perform(animated: !s.disableAnimation) {
            tableView.beginUpdates()
            tableView.deleteSections(NSIndexSet(array: i), withRowAnimation: UITableViewRowAnimation.Automatic)
            for section in sorted(i, >) {
              s.sectionBonds[section].unbindAll()
              s.sectionBonds.removeAtIndex(section)
              
              for var idx = section; idx < s.sectionBonds.count; idx++ {
                s.sectionBonds[idx].section -= 1
              }
            }
            
            tableView.endUpdates()
          }
        }
      }
    }
  
    self.didUpdateListener = { [weak self] array, i in
      if let s = self {
        if let tableView = s.tableView {
          perform(animated: !s.disableAnimation) {
            tableView.beginUpdates()
            tableView.reloadSections(NSIndexSet(array: i), withRowAnimation: UITableViewRowAnimation.Automatic)

            for section in i {
              let sectionBond = UITableViewDataSourceSectionBond<Void>(tableView: tableView, section: section)
              let sectionDynamic = array[section]
              sectionDynamic.bindTo(sectionBond)
              
              self?.sectionBonds[section].unbindAll()
              self?.sectionBonds[section] = sectionBond
            }
            
            tableView.endUpdates()
          }
        }
      }
    }
  }
