 	public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
 		return set[section].count
 	}
+
+	public func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
+		switch editingStyle {
+		case .insert:
+			insertionHandler?(indexPath)
+
+		case .delete:
+			deletionHandler?(indexPath)
+
+		case .none:
+			fatalError("Unexpected editing style received from UITableView.")
+		}
+	}
+
+	public func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
+		return editabilityHandler?(indexPath) ?? true
+	}
 }

	private var sectionNameMapper: ((position: Int, persistedName: String?) -> String?)?

	private var isEmpty: Bool = true
	public var emptiedObserver: (() -> Void)?
	public var unemptiedObserver: (() -> Void)?

	public init(set: ViewModelMappingSet<V>) {
		self.set = set

		return self
	}

	public func on(emptied: (() -> Void)? = nil, unemptied: (() -> Void)? = nil, inserting: ((IndexPath) -> Void)? = nil, deleting: ((IndexPath) -> Void)? = nil) -> Self {
		emptiedObserver = emptied ?? emptiedObserver
		unemptiedObserver = unemptied ?? unemptiedObserver
		insertionHandler = inserting ?? insertionHandler
		deletionHandler = deleting ?? deletionHandler
		return self
	}

	public func filterEditable(_ predicate: (IndexPath) -> Bool) -> Self {
		editabilityHandler = predicate
		return self
	}

