 
 // MARK: UITableView Support
 
+public protocol ComposableTableViewDataSource: UITableViewDataSource {
+    var underlyingDataSource: UITableViewDataSource { get }
+    init(_: UITableViewDataSource)
+}
 
 /// A provider of a UITableViewDataSource.
-public protocol UITableViewDataSourceProvider {    
-    var tableViewDataSource: UITableViewDataSource { get }
+public protocol UITableViewDataSourceProvider {
+    typealias TableViewDataSource: ComposableTableViewDataSource
+    var tableViewDataSource: TableViewDataSource { get }
 }
 
 /// An empty protocol to allow constraining a view type to UITableView.

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 {

    typealias TableView = DatasourceProvider.Datasource.FactoryType.ViewType

    public let provider: DatasourceProvider

    public var datasource: DatasourceProvider.Datasource {
        return provider.datasource

        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
