   option when opening the file and then all other functions from
   `IO` are available, since they work directly with Unicode data.
 
+  `modes_or_function` can either be a list of modes or a function. If it's a
+  list, it's considered to be a list of modes (that are documented below). If
+  it's a function, then it's equivalent to calling `open(path, [],
+  modes_or_function)`. See the documentation for `open/3` for more information
+  on this function.
+
   The allowed modes:
 
     * `:binary` - opens the file in binary mode, disabling special handling of unicode sequences


  Returns the IO device otherwise.

  See `open/2` for the list of available `modes`.
  """
  @spec open!(Path.t, [mode | :ram]) :: io_device | no_return
  def open!(path, modes \\ []) do
    case open(path, modes) do
      {:ok, io_device} ->
        io_device
      {:error, reason} ->
        raise File.Error, reason: reason, action: "open", path: IO.chardata_to_string(path)
    end

  end

  @doc ~S"""
  Opens the given `path`.

  In order to write and read files, one must use the functions
  in the `IO` module. By default, a file is opened in `:binary` mode,
