 extension DataSource {
     public struct Middleware {
         public var apply: (UIView) -> Void
-        init<View: UIView>(apply: @escaping (View) -> Void) {
+        public init<View: UIView>(apply: @escaping (View) -> Void) {
             self.apply = { view in
                 if let view = view as? View {
                     apply(view)

         - reorderable: Flag to indicate if this item can be reordered
         - customReuseIdentifier: Set to override the default reuseIdentifier. Default is nil.
         */
        fileprivate init<T: UIView>(configure: @escaping (T) -> Void, onSelect: IndexPathBlock? = nil, onDelete: IndexPathBlock? = nil, reorderable: Bool = false, customReuseIdentifier: String? = nil) where T : UIView {
            super.init(customReuseIdentifier: customReuseIdentifier, configure: configure)
            self.onSelect = onSelect
            self.onDelete = onDelete

    }

    /// Convenience init for a DataSource with a single section with no headers/footers
    public convenience init(items: [Item], onReorder: ReorderBlock? = nil, onScroll: ScrollBlock? = nil) {
        self.init(
            sections: [Section(items: items)],
            onReorder: onReorder,
