             return UITableViewAutomaticDimension
         }
     }
-
+    
 }
 
 extension TableViewManager: UITableViewDataSource {
-
+    
     public func numberOfSections(in tableView: UITableView) -> Int {
         return sections.count
     }
-
+    
     public func tableView(_ tableView: UITableView, numberOfRowsInSection sectionIndex: Int) -> Int {
         let section = sections[sectionIndex]
         return section.items.count
     }
-
+    
     public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
-
+        
         let currentItem = item(forIndexPath: indexPath)
         let drawer = currentItem.drawer
-
+        
         let cell = drawer.cell(inManager: self, withItem: currentItem, forIndexPath: indexPath)
         drawer.draw(cell, withItem: currentItem)
-
+        
         return cell
     }
-
-
+    
+    
     public func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
         return title(forKey: {$0.header}, inSection: section)
     }
-
-
+    
+    
     public func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? {
         return title(forKey: {$0.footer}, inSection: section)
     }
-
-
+    
+    
 }
 
 extension TableViewManager: UITableViewDelegate {
-
+    
     public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
         guard let currentItem = item(forIndexPath: indexPath) as? Selectable else { return }
         currentItem.onSelection(currentItem)
     }
-
+    
     public func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: IndexPath) -> CGFloat {
         return height(atIndexPath: indexPath) ?? tableView.rowHeight
-        }
-
+    }
+    
     public func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
         return height(forKey: {$0.header}, inSection: section) ?? tableView.sectionHeaderHeight
-        }
-
+    }
+    
     public func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
         return height(forKey: {$0.footer}, inSection: section) ?? tableView.sectionFooterHeight
-        }
-
+    }
+    
     public func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: IndexPath) -> CGFloat {
         return estimatedHeight(atIndexPath: indexPath) ?? tableView.estimatedRowHeight
     }
-
+    
     public func tableView(tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {
         return estimatedHeight(forKey: {$0.header}, inSection: section) ?? tableView.estimatedSectionHeaderHeight
     }
-
+    
     public func tableView(tableView: UITableView, estimatedHeightForFooterInSection section: Int) -> CGFloat {
         return estimatedHeight(forKey: {$0.footer}, inSection: section) ?? tableView.estimatedSectionHeaderHeight
     }
-
+    
     public func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
         return view(forKey: {$0.header}, inSection: section)
     }
-
+    
     public func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
         return view(forKey: {$0.footer}, inSection: section)
     }
-
-}
+    
+}

import UIKit

open class TableViewManager: NSObject {

    // MARK: Properties
    open let tableView: UITableView
    open var sections: ObservableArray<Section>

    open var validator: ValidatorManager<String?> = ValidatorManager()
    open var errors: [ValidationError] {
        get {
            return validator.errors
        }
    }


    // MARK: Inits

    public init(tableView: UITableView) {
        self.tableView = tableView
        self.sections = []

        self.setupSections()
        
    }
    
    public convenience init(tableView: UITableView, sections: [Section]) {
        self.init(tableView: tableView)
        self.sections.replace(with: sections)
    }
    
