module AWS::S3::PaginatedCollection

def _each_item markers, limit, options = {}, &block

def _each_item markers, limit, options = {}, &block
  options = list_options(options)
  options.merge!(markers) unless markers.nil? or markers.empty?
  options[limit_param] = limit || 1000
  response = list_request(options)
  each_member_in_page(response, &block)
  response.data[:truncated] ? next_markers(response) : nil
end

def each_member_in_page(page, &block); end

def each_member_in_page(page, &block); end

def limit_param

def limit_param
  raise NotImplementedError
end

def list_options options

def list_options options
  opts = {}
  opts[:bucket_name] = bucket.name if respond_to?(:bucket)
  opts
end

def list_request(options)

def list_request(options)
  raise NotImplementedError
end

def next_markers page

def next_markers page
  pagination_markers.inject({}) do |markers, marker_name|
    if marker = page.data[:"next_#{marker_name}"]
      markers[marker_name] = marker if marker
    end
    markers
  end
end

def pagination_markers

def pagination_markers
  [:key_marker]
end