 
     // MARK: Relationships
 
+    /**
+     Get the related resources for a `Relationship`.
+
+     - parameters:
+       - related: The relationship to get.
+       - limit: The maximum amount of results to return.
+       - offset: The offset to use for pagination.
+       - completion: The handler to call with the results.
+     */
     public func get<T>(related: Relationship<T>, limit: Int? = nil, offset: Int? = nil, completion: ((ResponseRoot<T>?, Error?) -> Void)?) {
         let path = related.href
         let request = urlBuilder.relationshipRequest(path: path, limit: limit, offset: offset)

        self.fetcher = urlFetcher
    }

    public init(storefront: Storefront, developerToken: String, urlFetcher: UrlFetcher = CiderClient.defaultURLFetcher) {
        let urlBuilder = CiderUrlBuilder(storefront: storefront, developerToken: developerToken)
        self.init(urlBuilder: urlBuilder, urlFetcher: urlFetcher)
    }

    // MARK: Requests

    public func search(term: String, limit: Int? = nil, offset: Int? = nil, types: [MediaType]? = nil, completion: ((SearchResponseRoot?, Error?) -> Void)?) {
        let request = urlBuilder.searchRequest(term: term, limit: limit, offset: offset, types: types)
        fetch(request, completion: completion)
    }

    public func searchHints(term: String, limit: Int? = nil, types: [MediaType]? = nil, completion: ((ResponseRoot<SearchHints>?, Error?) -> Void)?) {
        let request = urlBuilder.searchHintsRequest(term: term, limit: limit, types: types)
        fetch(request, completion: completion)
    }

    public func artist(id: String, include: [Include]? = nil, completion: ((ResponseRoot<Artist>?, Error?) -> Void)?) {
        let request = urlBuilder.fetchRequest(mediaType: .artists, id: id, include: include)
        fetch(request, completion: completion)
    }

    public func album(id: String, include: [Include]? = nil, completion: ((ResponseRoot<Album>?, Error?) -> Void)?) {
        let request = urlBuilder.fetchRequest(mediaType: .albums, id: id, include: include)
        fetch(request, completion: completion)
    }

    public func song(id: String, include: [Include]? = nil, completion: ((ResponseRoot<Track>?, Error?) -> Void)?) {
        let request = urlBuilder.fetchRequest(mediaType: .songs, id: id, include: include)
        fetch(request, completion: completion)
    }

    public func playlist(id: String, include: [Include]? = nil, completion: ((ResponseRoot<Playlist>?, Error?) -> Void)?) {
        let request = urlBuilder.fetchRequest(mediaType: .playlists, id: id, include: include)
        fetch(request, completion: completion)
    }

    public func musicVideo(id: String, include: [Include]? = nil, completion: ((ResponseRoot<MusicVideo>?, Error?) -> Void)?) {
        let request = urlBuilder.fetchRequest(mediaType: .musicVideos, id: id, include: include)
        fetch(request, completion: completion)
    }

    public func curator(id: String, include: [Include]? = nil, completion: ((ResponseRoot<Curator>?, Error?) -> Void)?) {
        let request = urlBuilder.fetchRequest(mediaType: .curators, id: id, include: include)
        fetch(request, completion: completion)


    // MARK: URLFetcher

    /**
     Default `UrlFetcher`

     A `URLSession` with the default `URLSessionConfiguration`
     */
    public static var defaultURLFetcher: UrlFetcher {
        return URLSession(configuration: URLSessionConfiguration.default)
    }
