             }
         }
     }
+
+
+    fileprivate var _rowsAndSections: SectionedValues<S, T>
+    fileprivate func processChanges(newState: SectionedValues<S, T>, diff: [DiffStep2D<S, T>]){
+        fatalError("override me")
+    }
 }
 
-public class TableViewDiffCalculator<S: Equatable, T: Equatable>: DiffCalculator {
+public class TableViewDiffCalculator<S: Equatable, T: Equatable>: AbstractDiffCalculator<S, T> {
 
     public weak var tableView: UITableView?
 
-    private var _rowsAndSections: SectionedValues<S, T>
-
     public init(tableView: UITableView, initialRowsAndSections: SectionedValues<S, T> = SectionedValues()) {
         self.tableView = tableView
-        self._rowsAndSections = initialRowsAndSections
+        super.init(initialRowsAndSections: initialRowsAndSections)
     }
 
     /// You can change insertion/deletion animations like this! Fade works well. So does Top/Bottom. Left/Right/Middle are a little weird, but hey, do your thing.
     public var insertionAnimation = UITableViewRowAnimation.automatic, deletionAnimation = UITableViewRowAnimation.automatic
 
-    public func internalRowsAndSections() -> SectionedValues<S, T> {
-        return self._rowsAndSections
-    }
-
-    public func processChanges(newState: SectionedValues<S, T>, diff: [DiffStep2D<S, T>]) {
+    override public func processChanges(newState: SectionedValues<S, T>, diff: [DiffStep2D<S, T>]) {
         guard let tableView = self.tableView else { return }
         tableView.beginUpdates()
         self._rowsAndSections = newState

        return self.rowsAndSections[indexPath.section].1[indexPath.row]
    }

    public var rowsAndSections : SectionedValues<S, T> {
        get {
            return internalRowsAndSections()
        }
        set {
            let oldRowsAndSections = rowsAndSections


import UIKit

class AbstractDiffCalculator<S: Equatable, T:Equatable> {

    init(initialRowsAndSections: SectionedValues<S, T>) {
        self._rowsAndSections = initialRowsAndSections
    }

    public func numberOfSections() -> Int {
        return self.rowsAndSections.count
    }
