         register(viewType, forSupplementaryViewOfKind: kind, withReuseIdentifier: viewType.reuseIdentifier)
     }
 
-    func supplementaryView<T: UICollectionReusableView>(forElementKind elementKind: String,
+    func dequeueSupplementaryView<T: UICollectionReusableView>(forElementKind elementKind: String,
                                                         at indexPath: IndexPath) -> T
     where T: ReusableView {
 


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
    }



        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 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)`")
