 
 // MARK: - Decodable
 
+// TODO: Add docstring
 public protocol Decodable {
     init(json: AnyObject) throws
 }
 
 // MARK: - Decoder
 
+// TODO: Add docstring
 public protocol Decoder {
     func decodeObject(object: AnyObject) throws -> Any
 }
 
 // MARK: - ParserError
 
+// TODO: Add docstring
 public enum ParserError: ErrorType, CustomStringConvertible, CustomDebugStringConvertible {
     case Deserialization(failureReason: String)
     case Validation(failureReason: String)
 
+    // TODO: Add docstring
     public var failureReason: String {
         switch self {
         case .Deserialization(let failureReason):

        return properties[keyPath] as! T
    }

    public class func parseDecodableArray<T: Decodable>(
        data data: NSData,
        forKeyPath keyPath: String)


// MARK: -

/**
    The date decoder converts a `String` into an `NSDate` object using the provided date format string 
    or `NSDateFormatter`.
*/
public class DateDecoder: Decoder {
    private let dateFormatter: NSDateFormatter

    /**
        Creates a data decoder with the given date format string.

        - parameter dateFormatString: The date format string.

        - returns: The date decoder.
    */
    public init(dateFormatString: String) {
        self.dateFormatter = NSDateFormatter()
        self.dateFormatter.dateFormat = dateFormatString
    }

    /**
        Creates a date decoder with the given date formatter.

        - parameter dateFormatter: A `NSDateFormatter` instance.

        - returns: The date decoder.
    */
    public init(dateFormatter: NSDateFormatter) {
        self.dateFormatter = dateFormatter
    }

    /**
        Decodes the data parameter into an `NSDate`.

        - parameter data: The string to parse. MUST be of type `String` or `NSString`.

        - returns: The parsed date.
    */
    public func decodeObject(data: AnyObject) throws -> Any {
        if let string = data as? String {
            return try dateFromString(string, withFormatter:self.dateFormatter)
