 }
 
 
-private class TableViewDelegate<T> : NSObject, UITableViewDataSource, UITableViewDelegate {
+private class TableViewDelegate<T, CellType: UITableViewCell> : NSObject, UITableViewDataSource, UITableViewDelegate {
     let items: ObservableArray<T>
     let cellIdentifier: String
-    let configureCell: (T, UITableViewCell) -> Void
+    let configureCell: (T, CellType) -> Void
     
-    init(items: ObservableArray<T>, cellIdentifier: String, configureCell: (T, UITableViewCell) -> Void) {
+    var selectionBlock: (T -> Void)?
+    
+    init(items: ObservableArray<T>, cellIdentifier: String, configureCell: (T, CellType) -> Void) {
         self.items = items
         self.cellIdentifier = cellIdentifier
         self.configureCell = configureCell

    }
    
    @objc func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath)
        configureCell(items[indexPath.row], cell)
        return cell
    }


public extension UITableView {
    
    func b_items<T, CellType: UITableViewCell>(items: ObservableArray<T>, cellIdentifier: String, configureCell: (T, CellType) -> Void) {
        let delegate = TableViewDelegate(items: items, cellIdentifier: cellIdentifier, configureCell: configureCell)
        set("delegate", value: (delegate as AnyObject))
        
