         return cell
     }
 
-    func headerFooterView<T: UITableViewCell>() -> T
+    func dequeueHeaderFooterView<T: UITableViewCell>() -> T
     where T: ReusableView {
         guard let view = dequeueReusableHeaderFooterView(withIdentifier: T.reuseIdentifier) as? T else {
             assertionFailure("🔥 Did you forget to register view with identifier `\(T.reuseIdentifier)` for type: `\(T.self)`")
             return T()
         }
 
+        return view
+    }
+    
+    func cell<T: UITableViewCell>(`for` indexPath: IndexPath) -> T
+    where T: ReusableView {
+        guard let cell = cellForRow(at: indexPath) as? T else {
+            assertionFailure("🔥 Cell for row at \(indexPath) is not of type: `\(T.self)`")
+            return T()
+        }
+        
+        return cell
+    }
+    
+    func headerView<T: UITableViewCell>(forSection section: Int) -> T
+    where T: ReusableView {
+        guard let view = headerView(forSection: section) as? T else {
+            assertionFailure("🔥 Header view at section \(section) is not of type: `\(T.self)`")
+            return T()
+        }
+        
+        return view
+    }
+    
+    func footerView<T: UITableViewCell>(forSection section: Int) -> T
+    where T: ReusableView {
+        guard let view = footerView(forSection: section) as? T else {
+            assertionFailure("🔥 Footer view at section \(section) is not of type: `\(T.self)`")
+            return T()
+        }
+        
         return view
     }
 


public extension UICollectionView {

    func cell<T: UICollectionViewCell>(`for` indexPath: IndexPath) -> T
    where T: ReusableView {
        guard let cell = dequeueReusableCell(withReuseIdentifier: T.reuseIdentifier, for: indexPath) as? T else {
            assertionFailure("🔥 Did you forget to register cell with identifier `\(T.reuseIdentifier)` for type: `\(T.self)`")
            return T()
        }

        return cell
    }


        register(viewType, forSupplementaryViewOfKind: kind, withReuseIdentifier: viewType.reuseIdentifier)
    }

    func dequeueSupplementaryView<T: UICollectionReusableView>(forElementKind elementKind: String,
                                                        at indexPath: IndexPath) -> T
    where T: ReusableView {

