             titleForFooterInSection: { (view, section) -> String? in
                 p.datasource.textForSupplementaryElementInView(view as! TableView, kind: .Footer, atIndexPath: NSIndexPath(forRow: 0, inSection: section)) }
         )
-    }
-
-    public var tableViewDataSource: UITableViewDataSource {
-        return bridgedTableViewDataSource
-    }
-}
-
-class TableViewDataSource: NSObject, UITableViewDataSource {
+
+        tableViewDataSource = TableViewDataSource(bridgedTableViewDataSource)
+    }
+}
+
+public class BasicTableViewDataSourceProvider<DatasourceProvider where DatasourceProvider: DatasourceProviderType, DatasourceProvider.Datasource.FactoryType.ViewType: UITableViewType, DatasourceProvider.Datasource.FactoryType.TextType == String>: TableViewDataSourceProvider<ComposedTableViewDataSource, DatasourceProvider> {
+
+    /// Initalizes with a Datasource instance.
+    public override init(_ p: DatasourceProvider) {
+        super.init(p)
+    }
+}
+
+class ComposedTableViewDataSource: NSObject, ComposableTableViewDataSource {
+
+    let underlyingDataSource: UITableViewDataSource
+
+    required init(_ u: UITableViewDataSource) {
+        underlyingDataSource = u
+    }
+
+    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
+        return underlyingDataSource.numberOfSectionsInTableView?(tableView) ?? 1
+    }
+
+    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+        return underlyingDataSource.tableView(tableView, numberOfRowsInSection: section)
+    }
+
+    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
+        return underlyingDataSource.tableView(tableView, cellForRowAtIndexPath: indexPath)
+    }
+
+    func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
+        return underlyingDataSource.tableView?(tableView, titleForHeaderInSection: section)
+    }
+
+    func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? {
+        return underlyingDataSource.tableView?(tableView, titleForFooterInSection: section)
+    }
+}
+
+class BaseTableViewDataSource: NSObject, UITableViewDataSource {
 
     private let numberOfSections: (UITableView) -> Int
     private let numberOfRowsInSection: (UITableView, Int) -> Int


// 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
