   end
 
   @doc """
-  Sets the `reply_to` header.
-
-  Valid formats:
-  * `"tony@stark.com"`
-  * `{"Tony Stark", "tony@stark.com"}`
+  Sets a recipient in the `reply_to` field.
+
+  The recipient must be either; a tuple specifying the name and address of the recipient; a string specifying the 
+  address of the recipient.
+
+        iex> %Email{} |> reply_to({"Steve Rogers", "steve@rogers.com"})
+        %Email{assigns: %{}, attachments: nil, bcc: [], cc: [], from: nil,
+         headers: %{}, html_body: nil, private: %{}, provider_options: %{},
+         reply_to: {"Steve Rogers", "steve@rogers.com"}, subject: "", text_body: nil, to: []}
+
+        iex> %Email{} |> reply_to("steve@rogers.com")
+        %Email{assigns: %{}, attachments: nil, bcc: [], cc: [], from: nil,
+         headers: %{}, html_body: nil, private: %{}, provider_options: %{},
+         reply_to: {"", "steve@rogers.com"}, subject: "", text_body: nil, to: []}
   """
   def reply_to(%__MODULE__{} = email, reply_to) do
     reply_to = format_recipient(reply_to)
     %{email | reply_to: reply_to}
   end
 
-  for fun <- [:subject, :text_body, :html_body]  do
-    @doc """
-    Sets the #{fun}.
-
-    Valid formats:
-    * `"tony@stark.com"`
-    * `{"Tony Stark", "tony@stark.com"}`
-    """
-    def unquote(fun)(%__MODULE__{} = email, value) do
-      %{email | unquote(fun) => value}
-    end
-  end
+  @doc """
+  Sets the `subject` field.
+
+  The subject must be a string that contains the subject.
+
+        iex> %Email{} |> subject("Hello")
+        %Email{assigns: %{}, attachments: nil, bcc: [],
+        cc: [], from: nil, headers: %{}, html_body: nil,
+         private: %{}, provider_options: %{}, reply_to: nil, subject: "Hello, Avengers!",
+         text_body: nil, to: []}
+  """
+  def subject(email, subject), do: %{email|subject: subject}
+
+  @doc """
+  Sets the `text_body` field.
+
+  The text body must be a string that containing the plaintext content.
+
+      iex> %Email{} |> text_body("Hello")
+      %Email{assigns: %{}, attachments: nil, bcc: [],
+       cc: [], from: nil, headers: %{}, html_body: nil,
+       private: %{}, provider_options: %{}, reply_to: nil, subject: "",
+       text_body: "Hello", to: []}
+  """
+  def text_body(email, text_body), do: %{email|text_body: text_body}
+
+  @doc """
+  Sets the `html_body` field.
+
+  The HTML body must be a string that containing the HTML content.
+
+      iex> %Email{} |> html_body("<h1>Hello</h1>")
+      %Email{assigns: %{}, attachments: nil, bcc: [],
+       cc: [], from: nil, headers: %{}, html_body: "<h1>Hello</h1>",
+       private: %{}, provider_options: %{}, reply_to: nil, subject: "",
+       text_body: nil, to: []}
+  """
+  def html_body(email, html_body), do: %{email|html_body: html_body}
 
   for fun <- [:to, :cc, :bcc] do
     @doc """
-    Adds new recipients to the `#{fun}` header.
-
-    Valid formats for recipients:
-    * `"tony@stark.com"`
-    * `{"Tony Stark", "tony@stark.com"}`
+    Adds new recipients in the `#{fun}` field.
+
+    The recipient must be; a tuple specifying the name and address of the recipient; a string specifying the 
+    address of the recipient; or an array comprised of a combination of either.
+
+          iex> %Email{} |> #{fun}("steve@rogers.com")
+          %Email{assigns: %{}, attachments: nil, bcc: [],
+           cc: [{"", "steve@rogers.com"}], from: nil, headers: %{}, html_body: nil,
+           private: %{}, provider_options: %{}, reply_to: nil, subject: "",
+           text_body: nil, to: []}
+
+    iex>
     """
     def unquote(fun)(%__MODULE__{unquote(fun) => existing_recipients} = email, recipients) when is_list(recipients) do
       recipients =
         recipients
         |> Enum.map(&format_recipient(&1))
-        |> Kernel.++(existing_recipients)
+        |> Enum.concat(existing_recipients)
       %{email | unquote(fun) => recipients}
     end
     def unquote(fun)(%__MODULE__{} = email, recipient) do

  end

  @doc """
  Puts a new header in the email.

  The header name and value must be of type string.
  """
  def header(%__MODULE__{headers: headers} = email, name, value) when is_binary(name) and is_binary(value) do
    headers = headers |> Map.put(name, value)

    The recipient `#{inspect invalid}` is invalid.

    Recipients must be a string representing an email address like
    `foo@bar.com` or a two element tuple `{name, address}`, where
    name and address are strings.
    """
  end
