module AWS::Core::Cacheable

def self.included base

def self.included base
  base.extend Naming unless base.respond_to?(:service_ruby_name)
end

def cache_key

def cache_key
  @cache_key ||= begin
    endpoint_method = self.class.service_ruby_name + "_endpoint"
    config.signer.access_key_id + ":" +
      config.send(endpoint_method) + ":" +
      self.class.name + ":" +
      local_cache_key
  end
end

def local_cache_key

def local_cache_key
  raise NotImplementedError
end

def retrieve_attribute attr, &block

def retrieve_attribute attr, &block
  if cache = AWS.response_cache
    if cache.resource_cache.cached?(cache_key, attr.name)
      return cache.resource_cache.get(cache_key, attr.name)
    end
    cache.select(*attr.request_types).each do |response|
      if attributes = attributes_from_response(response)
        cache.resource_cache.store(cache_key, attributes)
        return attributes[attr.name] if attributes.key?(attr.name)
      end
    end
  end
  response = yield
  if attributes = attributes_from_response(response)
    if cache = AWS.response_cache
      cache.resource_cache.store(cache_key, attributes)
    end
    attributes[attr.name] if attributes.key?(attr.name)
  else
    raise NoData.new("no data in #{response.request_type} response")
  end
end