 extension TableViewModelController {
     
     open override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
-        guard
-            let cell = tableView.cellForRow(at: indexPath),
-            let tableViewModelCell = cell as? TableViewModelCell
-        else { return }
-        
+        guard let cell = tableView.cellForRow(at: indexPath) as? UITableViewCell & TableViewModelCell else {
+            return
+        }
         if cell.selectionStyle != .none {
-            tableViewModelCell.action(cell)
+            delegate?.performAction(for: cell, at: indexPath, sender: self)
         }
     }
     

public protocol TableViewModelControllerDelegate: class {
    func cell(forIdentifier identifier: String) -> TableCell
    func update(_ cell: UITableViewCell & TableViewModelCell, at indexPath: IndexPath)
}

public extension TableViewModelControllerDelegate where Self: TableViewModelController {
    func cell(forIdentifier identifier: String) -> TableCell {
        return .basic
    }
    func update(_ cell: UITableViewCell & TableViewModelCell, at indexPath: IndexPath) {
        let item = dataSource.item(at: indexPath)
        cell.update(with: item)
    }
}

open class TableViewModelController: UITableViewController {
    
    // MARK: Properties


    
    private func registerCell(with identifier: String) {
        guard let delegate = delegate else {
            fatalError("Delegate must be provided by now.")
        }
        switch delegate.cell(forIdentifier: identifier) {
        case .basic:
