   typealias DataSourceType = ObjectsDataSource<ObjectType>
   
   public var nibNameForObjectMatching: (ObjectType -> String)!
+  public var footerNibNameForSectionIndexMatching: (Int -> String?) = { _ in nil }
+  public var headerNibNameForSectionIndexMatching: (Int -> String?) = { _ in nil }
   
   public let didSelectCellSignal = Pipe<(cell: UITableViewCell?, object: ObjectType?)>()
   public let willDisplayCellSignal = Pipe<(UITableViewCell, NSIndexPath)>()

  private weak var tableView: UITableView!
  private var nibs = [String: UINib]()
  private var dataSource: ObjectsDataSource<ObjectType>!
  private var instances = [String: UITableViewCell]()
  private var identifiersForIndexPaths = [NSIndexPath: String]()
  private var mappings: [String: (ObjectType, UITableViewCell, NSIndexPath) -> Void] = [:]
  

    }.putInto(pool)
  }
  
  public func registerSectionHeaderFooterClass(headerFooterClass: UITableViewHeaderFooterView.Type) {
    let identifier = String(headerFooterClass)
    let nib = UINib(nibName: identifier, bundle: nil)
    headerFooterInstances[identifier] = nib.instantiateWithOwner(self, options: nil).last as? UITableViewHeaderFooterView
    tableView.registerClass(headerFooterClass, forHeaderFooterViewReuseIdentifier: identifier)
  }
  
  public func registerCellClass<U: ObjectConsuming where U.ObjectType == ObjectType>(cellClass: U.Type) {
    let identifier = String(cellClass)
    let nib = UINib(nibName: identifier, bundle: nil)
    tableView.registerNib(nib, forCellReuseIdentifier: identifier)
    cellInstances[identifier] = nib.instantiateWithOwner(self, options: nil).last as? UITableViewCell
    
    mappings[identifier] = { object, cell, _ in
      if let consumer = cell as? U { consumer.applyObject(object) }
