         tableView?.reloadData()
     }
     
+    // MARK: - Private
+    private func row(at indexPath: IndexPath) -> Row? {
+        if indexPath.section < sections.count && indexPath.row < sections[indexPath.section].rows.count {
+            return sections[indexPath.section].rows[indexPath.row]
+        }
+        return nil
+    }
+    
     // MARK: Public
     @discardableResult
     open func invoke(

        cell: UITableViewCell?, indexPath: IndexPath,
        userInfo: [AnyHashable: Any]? = nil) -> Any?
    {
        if indexPath.section < sections.count && indexPath.row < sections[indexPath.section].rows.count {
            return sections[indexPath.section].rows[indexPath.row].invoke(
                action: action,
                cell: cell,
                path: indexPath,
                userInfo: userInfo
            )
        }
        return nil
    }
    
    open override func responds(to selector: Selector) -> Bool {

    
    // MARK: - Internal
    func hasAction(_ action: TableRowActionType, atIndexPath indexPath: IndexPath) -> Bool {
        guard let row = row(at: indexPath) else { return false }
        return row.has(action: action)
    }
    
    @objc
