anchor.diff:           handle_call/3, handle_cast/2, handle_info/2]).
   
   %% -- private --
  -
   -record(state, {
  -          handle :: tuple(),
  -          auth :: boolean()
  +          args :: [property()],
  +          handle :: tuple()
            }).
  +
  +-define(SOCKET(Handle), element(2,Handle)).     % !CAUTION!
   
   %% == public ==
   
   -spec start_link([property()]) -> {ok,pid()}|ignore|{error,_}.
   start_link(Args) ->
  -    start_link(Args, false). % for poolboy
  +    start_link(Args, false).
   
   -spec start_link([property()],boolean()) -> {ok,pid()}|ignore|{error,_}.
   start_link(Args, false)
  
positive.code:     end;
  start_link(Args, true)
    when is_list(Args) ->
      case gen_server:start_link(?MODULE, [], []) of
          {ok, Pid} ->
              case gen_server:call(Pid, {setup,Args}, infinity) of
                  ok ->
                      {ok, Pid};
                  {error, Reason} ->
                      stop(Pid),
                      {error, Reason}
              end;
          Other ->
              Other
      end.
  
  -spec stop(pid()) -> ok.
  stop(Pid)
    when is_pid(Pid) ->
      gen_server:cast(Pid, stop).
  
  -spec call(pid(),term()) -> term().
  call(Pid, Command)
    when is_pid(Pid) ->
      gen_server:call(Pid, Command).
  
  -spec cast(pid(),term()) -> ok.
  cast(Pid, Command)
    when is_pid(Pid) ->
      gen_server:cast(Pid, Command).
  
  %% == behaviour: gen_server ==
  
  init(Args) ->
  
negative.code:            true -> throw({badarg,K})
          end,
      [T|List];
  validate({default_character_set=K,Value}, List) -> % non_neg_integer()
      T = if is_integer(Value), 0 =< Value     -> {K, Value};
             true -> throw({badarg,K})
          end,
      [T|List];
  