module AWS::S3::DataOptions

def validate_data! options, block

def validate_data! options, block
  data = options[:data]
  filename = options[:file]
  raise ArgumentError, 'data passed multiple ways' if
    [data, filename, block].compact.size > 1
  # accepting block format
  return if block and block.arity == 1
  # accepting file path
  return if filename.kind_of?(String)
  # accepting strings
  return if data.kind_of?(String)
  # accepting pathname
  return if data.kind_of?(Pathname)
  # accepts io-like objects (responds to read and eof?)
  if data.respond_to?(:read) and 
      data.method(:read).arity != 0 and
      data.respond_to?(:eof?) then
    return true
  end
  raise ArgumentError, 'data must be provided as a String, ' +
    'Pathname, file path, or an object that responds to #read and #eof?'
end