         end
       end
       defoverridable fetch!: 2
- 
+
       def has_key?(dict, key) do
         match? { :ok, _ }, fetch(dict, key)
       end
       defoverridable has_key?: 2
- 
+
       def put_new(dict, key, value) do
         update(dict, key, value, fn(v) -> v end)
       end
       defoverridable put_new: 3
- 
+
       def drop(dict, []), do: dict
 
       def drop(dict, [key|keys]) do
         drop(delete(dict, key), keys)
       end
       defoverridable drop: 2
- 
+
       def take(dict, keys) do
         take(dict, keys, new)
       end
       defoverridable take: 2
- 
+
       defp take(_dict, [], acc), do: acc
       defp take(dict, [key|keys], acc) do
         case fetch(dict, key) do

        # override default implementations if needed
      end

  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 
  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 
  module via `Dict` doctests:

      defmodule MyDict do

        end
      end
      defoverridable equal?: 2

      def merge(dict, enumerable, callback // fn(_k, _v1, v2) -> v2 end) do
        Enum.reduce(enumerable, dict, fn({key, value}, acc) ->
          update(acc, key, value, fn(v1) -> callback.(key, v1, value) end)
