             }
         })
         task.resume()
+        return task
     }
 }

    ///   - session: The URL session to use
    ///   - responseQueue: The queue to  send the response on
    ///   - completion: The completion block to call with the response
    public func perform<T: Parsable>(session: URLSession = URLSession.shared, responseQueue: OperationQueue = OperationQueue.main, completion: @escaping (Result<T>) -> Void) {
        let task = session.dataTask(with: urlRequest(), completionHandler: { data, response, error in
            if let error = error {
                completion(.failure(error))

    }
}

/// Protocol describing an operation that can be cancelled
public protocol Cancellable {

    /// Cancel the operation
    func cancel()
}

extension URLSessionTask: Cancellable {}

public extension Request {

    /// Make an HTTP request for the resource described by this `Request`
