         }
     }
     
-    internal static func parse<T:Serializable,S>(response response:Response<S, NSError>, completionHandler: ApiResult<T> -> Void) {
+    internal static func parse<T:Serializable,S>(response response:Response<S, NSError>, completionHandler: ApiResult<T> -> Void, unwrapper:Unwrapper) {
         parse(response:response, completionHandler: completionHandler, parsingHandler: {
             ( data: AnyObject? ) -> T? in
             
             if let sourceDictionary = data as? [String : AnyObject] {
                 
-                let unwrappedDictionary = unwrappedSource(sourceDictionary, type:T.self) as? [String : AnyObject] ?? sourceDictionary
+                let unwrappedDictionary = unwrapper(sourceDictionary: sourceDictionary, expectedType:T.self) as? [String : AnyObject] ?? sourceDictionary
                 
                 return T(dictionary: unwrappedDictionary) as T?
             }

        })
    }
    
    internal static func parse<T:Serializable,S>(response response:Response<S, NSError>, completionHandler: ApiResult<[T]> -> Void) {
        Parser.parse(response:response, completionHandler: completionHandler, parsingHandler: {
            ( data: AnyObject? ) -> [T]? in
            
            var finalArray:AnyObject? = data
            
            if let dataDict = data as? NSDictionary {
                if let unwrappedArray = unwrappedSource(dataDict, type:T.self) as? [AnyObject] {
                    finalArray = unwrappedArray
                }
            }
            
            if let sourceArray = finalArray as? [AnyObject] {
                
                var returnArray:[T] = []
                for dict in sourceArray {
                    returnArray.append(T(dictionary: dict as? [String : AnyObject]))
                }
                return returnArray
            }
            return nil
        })

     
     - parameter completionHandler:A closure that is invoked when the request is finished
     
     - parameter unwrapper: A closure that extracts the data to be parsed from the JSON response data.
     The default implementation checks for a "data" field in the JSON response, then checks for a field
     with the same name as the target model. If not found, it passes the JSON response straight through.
     
     - returns: The request
     */
    
    public func responseSerializable<T:Serializable>(completionHandler: ApiResult<T> -> Void, unwrapper:Parser.Unwrapper = Parser.defaultUnwrapper) -> Self {
        return validate().responseJSON(completionHandler: { (response) -> Void in
            Parser.parse(response: response, completionHandler: completionHandler, unwrapper: unwrapper)
        })
    }
    
