 
       %User{} == %{__struct__: User, name: "john", age: 27}
 
-  A struct also validates that the given keys are part of the defined
-  struct. The example below will fail because there is no key
-  `:full_name` in the `User` struct:
+  The struct fields can be given when building the struct:
+
+      %User{age: 31}
+      #=> %{__struct__: User, name: "john", age: 31}
+
+  Or also on pattern matching to extract values out:
+
+      %User{age: age} = user
+
+  An update operation specific for structs is also available:
+
+      %User{user | age: 28}
+
+  The advantage of structs is that they validate that the given
+  keys are part of the defined struct. The example below will fail
+  because there is no key `:full_name` in the `User` struct:
 
       %User{full_name: "john doe"}
-
-  An update operation specific for structs is also available:
-
-      %User{user | age: 28}
 
   The syntax above will guarantee the given keys are valid at
   compilation time and it will guarantee at runtime the given

  can be used with protocols for polymorphic dispatch. Also
  see `Kernel.struct/2` and `Kernel.struct!/2` for examples on
  how to create and update structs dynamically.
  """
  defmacro unquote(:%)(struct, map), do: error!([struct, map])


  defmacro unquote(:%{})(args), do: error!([args])

  @doc """
  Matches on or builds a struct.

  A struct is a tagged map that allows developers to provide
  default values for keys, tags to be used in polymorphic
