def perform_request url, verb = :get, body = nil, options = {}
      options_id = options.inspect
      can_cache = [:post, :put].include?(verb) ? false : cached?
      if can_cache && result = store.get("#{clean_url(url)}#{options_id}")
        return JSON.parse(result)
      end
      response = perform_rate_limited_request(url, verb, body, options)
      store.setex "#{clean_url(url)}#{options_id}", ttl, response.to_json if can_cache
      response
    end
def perform_request url, verb = :get, body = nil, options = {}
      options_id = options.inspect
      can_cache = [:post, :put].include?(verb) ? false : cached?
      if can_cache && result = store.get("#{clean_url(url)}#{options_id}")
        return JSON.parse(result)
      end
      response = perform_rate_limited_request(url, verb, body, options)
      store.setex "#{clean_url(url)}#{options_id}", ttl, response.to_json if can_cache
      response
    end
Calls the API via HTTParty and handles errors caching it if a cache is
 enabled and rate limiting it if a rate limiter is configured
 @param url [String] the url to call
 @param verb [Symbol] HTTP verb to use. Defaults to :get
 @param body [Hash] Body for POST request
 @param options [Hash] Options passed to HTTParty
 @return [String] raw response of the call