 
         return supplementaryView
     }
+    
+    @available(iOS 9, *)
+    func supplementaryView<T: UICollectionReusableView>(forElementKind elementKind: String,
+                                  at indexPath: IndexPath) -> T
+    where T: ReusableView {
+        
+        guard let supplementaryView = supplementaryView(forElementKind: elementKind, at: indexPath) as? T else {
+                                                                        assertionFailure("🔥 SupplementaryView with identifier `\(T.reuseIdentifier)` not registered for type: `\(T.self)`!")
+                                                                        return T()
+        }
+        
+        return supplementaryView
+    }
 }
 
 // MARK: - UITableView Reusable properties
 
 public extension UITableView {
 
-    func cell<T: UITableViewCell>(`for` indexPath: IndexPath) -> T
+    func dequeueCell<T: UITableViewCell>(`for` indexPath: IndexPath) -> T
     where T: ReusableView {
         guard let cell = dequeueReusableCell(withIdentifier: T.reuseIdentifier, for: indexPath) as? T else {
             assertionFailure("🔥 Did you forget to register cell with identifier `\(T.reuseIdentifier)` for type: `\(T.self)`")

        return cell
    }

    func headerFooterView<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
    }



public extension UICollectionView {

    func dequeueCell<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
    }
    
    func cell<T: UICollectionViewCell>(`for` indexPath: IndexPath) -> T
    where T: ReusableView {
        guard let cell = cellForItem(at: indexPath) as? T else {
            assertionFailure("🔥 Cell at \(indexPath) is not of type: `\(T.self)`")
            return T()
        }
        
        return cell
    }

