 
     /// Custom info passed alongside the request.
     public var userInfo: Any?
-
-    // everything below exists solely to improve performance
-
-    /// Here we implement copy-on-write semantics.
-    private mutating func applyMutation(_ block: (Container) -> Void) {
+    
+    
+    // MARK: Initializers
+    
+    public init(url: URL) {
+        container = Container(resource: Resource.url(url))
+        container.urlString = url.absoluteString
+    }
+    
+    public init(urlRequest: URLRequest) {
+        container = Container(resource: Resource.request(urlRequest))
+        container.urlString = urlRequest.url?.absoluteString
+    }
+
+    
+    // Everything in the scope below exists solely to improve performance
+
+    fileprivate var container: Container
+
+    private mutating func applyMutation(_ closure: (Container) -> Void) {
         if !isKnownUniquelyReferenced(&container) {
             container = container.copy()
         }
-        block(container)
-    }
-
-    /// `Request` stores its parameters in a `Container` class to avoid
-    /// excessive memberwise retain/release when `Request` is passed around
-    /// (and it is passed around **a lot**).
-    fileprivate var container: Container
-
-    /// Request needs `struct` semantics, but not the way `struct` manages
-    /// memory (memberwise retain-release on each copy). This is way `Container`
-    /// exists - solely to improve memory performance.
+        closure(container)
+    }
+
+    /// `Request` stores its parameters in a `Container` to avoid memberwise
+    /// retain/release when `Request` is passed around (and it is passed around
+    /// **a lot**). This optimization is known as `copy-on-write`.
     fileprivate class Container {
         var resource: Resource
         var urlString: String? // memoized absoluteString

    /// `URLRequests` and the same processors. `URLRequests` are compared
    /// just by their `URLs`.
    public static func cacheKey(for request: Request) -> AnyHashable {
        return request.cacheKey ?? AnyHashable(Key(request: request) {
            $0.container.urlString == $1.container.urlString && $0.processor == $1.processor
        })
    }

    /// Returns a key which compares requests with regards to loading images.


/// Represents an image request.
public struct Request {
    
    // MARK: Parameters of the Request
    
    public var urlRequest: URLRequest {
        get { return container.resource.urlRequest }
        set {
