         # override default implementations if needed
       end
 
-  The client module must contain following functions: `size/1`, `fetch/2`, 
+  The client module must contain following functions: `size/1`, `fetch/2`,
   `put/3`, `update/4`, `delete/2` and `reduce/3`. All of them are part of
   the Dict behaviour, so no extra functions are actually required.
 
-  Based on these functions, `Dict.Behaviour` generates default implementations 
+  Based on these functions, `Dict.Behaviour` generates default implementations
   for other functions such as `drop`, `take`, etc. All of the functions are
   defined as overridable, so you can provide your own implementation if
   needed.
 
-  If you implement `new/0` and `new/1` functions, you can also test your custom 
+  If you implement `new/0` and `new/1` functions, you can also test your custom
   module via `Dict` doctests:
 
       defmodule MyDict do

          :error -> take(dict, keys, acc)
        end
      end
 
      def to_list(dict), do: reduce(dict, [], &[&1|&2]) |> Enum.reverse
      defoverridable to_list: 1
 
      def keys(dict), do: reduce(dict, [], fn({k, _}, acc) -> [k | acc] end) |> Enum.reverse
      defoverridable keys: 1
 
      def values(dict), do: reduce(dict, [], fn({_, v}, acc) -> [v | acc] end) |> Enum.reverse
      defoverridable values: 1
 
      def equal?(dict1, dict2) do
        case Dict.size(dict1) == Dict.size(dict2) do
          false -> false
          true -> 
            try do
              reduce(dict1, nil, fn({ k, v }, _acc) ->
                unless fetch(dict2, k) == { :ok, v }, do: throw(:error)

      end

  """
  defmacro __using__(_) do
    quote do
      @behaviour Dict

      def get(dict, key, default // nil) do
        case fetch(dict, key) do
          { :ok, value } -> value
