         return super.respondsToSelector(selector)
     }
     
+    /**
+     Returns the object to which unrecognized messages should first be directed.
+     The object to which unrecognized messages should first be directed.
+
+     - parameter selector: A selector for a method that the receiver does not implement.
+     
+     - returns: The object to which unrecognized messages should first be directed.
+     */
     public override func forwardingTargetForSelector(selector: Selector) -> AnyObject? {
         if scrollViewDelegateCanHandleSelector(selector) {
             return scrollViewDelegate

        return false
    }

    public override func respondsToSelector(selector: Selector) -> Bool {

        if sizeSelectors.contains(selector) {


import UIKit

/// Represents the selectors for querying a height/size of a cell.
let sizeSelectors: [Selector] = [
    #selector(UITableViewDelegate.tableView(_:heightForRowAtIndexPath:)),
    #selector(UICollectionViewDelegateFlowLayout.collectionView(_:layout:sizeForItemAtIndexPath:))
]

/**
 The Base class for all data source implementations this class is responsible for concrete implementation of UITableViewDataSource/UITableViewDelegate and UICollectionViewDataSource/UICollectionViewDelegate/UICollectionViewDelegateFlowLayout by forwarding the calls to a coressponding DataSource implementation (e.g. implementation of both `tableView:cellForRowAtIndexPath:` and `collectionView:cellForItemAtIndexPath:` will delegate the call to `ds_collectionView:cellForItemAtIndexPath:`).
 
 On the other side, implementation of DataSource methods just `fatalError`. Subclasses are responsible for providing the implementation of the DataSource calls.
 
 Since this class is will be the delegate of the UITableView and UICollectionView. You can catch UIScrollViewDelegate methods by either subclass and implement the required method or provide use the property `scrollViewDelegate`. **Note that** this property is retained.
 */
public class AbstractDataSource : NSObject, DataSource, UITableViewDataSource, UICollectionViewDataSource, UITableViewDelegate, UICollectionViewDelegateFlowLayout {

    /**
     Represents the scroll view delegate property. Delegate calls of functions in UIScrollViewDelegate protocol are forwarded to this object.
     **Note that:** this object is retained.
     */
    public var scrollViewDelegate: UIScrollViewDelegate? = nil {
        willSet {
            precondition(self !== newValue, "You cannot set a DataSource as UIScrollViewDelegate. Instead just override the UIScrollViewDelegate methods.")
        }
    }

    /**
     Represents the reusable view delegate usually you treat it as if it's a UICollectionView/UITableView object. In most cases, you don't need to assign this property.
     But you will need to use it to query the view for data (e.g. number of sections, etc.)
     */
    public weak var ds_reusableViewDelegate: GeneralCollectionView? = nil

    /**
     Initialize new instance of the AbstractDataSource `fatalError`. You should use one of its subclasses.
     */
    public override init() {
        let type = AbstractDataSource.self
        guard self.dynamicType != type else {
