     """
   end
 
-  @doc """
+  @doc ~S"""
   Stores a new **private** key and value in the email.
 
   This store is meant to be for libraries/framework usage. The name should be


  ## Examples

      iex> email.private[:phoenix_template]
      nil
      iex> email = put_private(email, :phoenix_template, "welcome.html")
      iex> email.private[:phoenix_template]
      "welcome.html"
  """
  def put_private(%__MODULE__{private: private} = email, key, value) when is_atom(key) do
    %{email | private: Map.put(private, key, value)}
  end

  @doc """
  Stores a new **provider_option** key and value in the email.

  This store is meant for adapter usage, to aid provider-specific functionality.
  The name should be specified as an atom, the value can be any term.

  ## Examples

      iex> email.provider_options[:async]
      nil
      iex> email = put_provider_option(email, :async, true)
      iex> email.provider_options[:async]
      true
  """
  def put_provider_option(%__MODULE__{provider_options: provider_options} = email, key, value) when is_atom(key) do
    %{email | provider_options: Map.put(provider_options, key, value)}
  end

  @doc """
  Stores a new variable key and value in the email.

  This store is meant for variables used in templating. The name should be specified as an atom, the value can be any


  ## Examples

      iex> %Swoosh.Email{} |> assign(:username, "ironman")
      %Swoosh.Email{assigns: %{username: "ironman"}, attachments: nil, bcc: [],
       cc: [], from: nil, headers: %{}, html_body: nil, private: %{},
       provider_options: %{}, reply_to: nil, subject: "", text_body: nil, to: []}
  """
  def assign(%__MODULE__{assigns: assigns} = email, key, value) when is_atom(key) do
    %{email | assigns: Map.put(assigns, key, value)}
