anchor.diff:                  url_cache = false,
                   timeout = Timeout}}.
   
  +-type msg() :: get_msg() | put_msg() | update_msg() | delayed_update_msg()
  +             | delete_attrib_msg() | delete_msg()
  +             | has_tagname_msg() | get_tagnames_msg() | delete_tagname_msg()
  +             | gc_get_msg()
  +               %% internal messages:
  +             | gc_get0.
  +
  +-type notify() :: notify_msg()
  +                  %% internal messages:
  +                | {notify0, term()}.
  +
   %%% Note to the reader!
   %%%
   %%% handle_casts below form a state machine. The order in which the functions
  
positive.code: %%% machine is to follow the logic from the top to the bottom.
  %%%
  
  % We don't want to cache requests made by garbage collector
  handle_cast({gc_get, ReplyTo}, #state{data = none} = S) ->
      handle_cast({gc_get0, ReplyTo}, S#state{timeout = 100});
  
negative.code:                 replicas :: 'false' | 'too_many_failed_nodes'
                      | [{replica(), node()}],
                  url_cache :: 'false' | gb_set()}).
  -type state() :: #state{}.
  
  % THOUGHT: Eventually we want to partition tag keyspace instead
  % of using a single global keyspace. This can be done relatively
  