 be used as the basic for a UITableViewDataSource, without the need
 to implement UITableViewDataSource on any of them.
 */
-public struct TableViewDataSourceProvider<DatasourceProvider where DatasourceProvider: DatasourceProviderType, DatasourceProvider.Datasource.FactoryType.ViewType: UITableViewType, DatasourceProvider.Datasource.FactoryType.TextType == String>: UITableViewDataSourceProvider {
+public class TableViewDataSourceProvider<TableViewDataSource: ComposableTableViewDataSource, DatasourceProvider where DatasourceProvider: DatasourceProviderType, DatasourceProvider.Datasource.FactoryType.ViewType: UITableViewType, DatasourceProvider.Datasource.FactoryType.TextType == String>: UITableViewDataSourceProvider {
 
     typealias TableView = DatasourceProvider.Datasource.FactoryType.ViewType
 
     public let provider: DatasourceProvider
+    public let tableViewDataSource: TableViewDataSource
 
     public var datasource: DatasourceProvider.Datasource {
         return provider.datasource


// MARK: UITableView Support


/// A provider of a UITableViewDataSource.
public protocol UITableViewDataSourceProvider {    
    var tableViewDataSource: UITableViewDataSource { get }
}

/// An empty protocol to allow constraining a view type to UITableView.

        return datasource.factory
    }
    
    private let bridgedTableViewDataSource: BaseTableViewDataSource

    /// Initalizes with a Datasource instance.
    public init(_ p: DatasourceProvider) {
        provider = p

        bridgedTableViewDataSource = BaseTableViewDataSource(
            numberOfSections: { (view) -> Int in
                p.datasource.numberOfSections },
            numberOfRowsInSection: { (view, section) -> Int in
