public Task <T> GetAsync <T>(string uri)
        {
            T cachedResponse;

            if (_cache.TryGetResponse(uri, out cachedResponse))
            {
                return(Task.FromResult(cachedResponse));
            }

            return(Task.Run(async() =>
            {
                var httpResult = await this.GetAsync(uri);

                if (!httpResult.IsSuccessStatusCode)
                {
                    throw new HttpRequestException($"Http Failure: Status {httpResult.StatusCode}");
                }

                var response = JsonConvert.DeserializeObject <T>(await httpResult.Content.ReadAsStringAsync());
                _cache.CacheResponse(uri, response);

                return response;
            }));
        }