     }
 }
 
-final class CollectionReusableViewSizerCacheGroup {
+public final class CollectionReusableViewSizerCacheGroup {
 
     private var sizers = [String: AnyObject]()
 
-    func sizeFor<View: UICollectionReusableView & SizerViewModelView>(
+    public init() {}
+
+    public func sizeFor<View: UICollectionReusableView & SizerViewModelView>(
         _ type: View.Type,
         viewModel: CollectionReusableViewSizer<View>.ViewModel,
         width: CollectionReusableViewSizer<View>.Dimension = .compressed,

import UIKit

final class CollectionReusableViewSizer<View: UICollectionReusableView & ReusableViewModelView> {

    typealias ViewModel = View.ViewModel

    enum Dimension: Hashable {

        case compressed
        case expanded

    }
}

public struct ConstantSizerCacheKey: Hashable {}

public protocol SizerViewModelView: ReusableViewModelView {

    associatedtype SizerCacheKey: Hashable = ConstantSizerCacheKey

    static func sizerCacheKeyFor(viewModel: ViewModel) -> SizerCacheKey
}

public extension SizerViewModelView where SizerCacheKey == ConstantSizerCacheKey {

    static func sizerCacheKeyFor(viewModel: ViewModel) -> SizerCacheKey { return SizerCacheKey() }
}

public final class CollectionReusableViewSizerCache<View: UICollectionReusableView & SizerViewModelView> {

    public typealias Sizer = CollectionReusableViewSizer<View>

    private struct Key: Hashable {
        let key: View.SizerCacheKey
