anchor.diff:                  refs = []
                  }).
   
  --export([start_link/0, start_link/1,
  +-export([start_link/0,
  +         start_link/1,
            register_service/2,
            unregister_service/1,
  +         sync_register_service/2,
  +         sync_unregister_service/1,
            is_registered/1,
            register_stats_fun/1,
            get_stats/0,
  
positive.code:                                 ?MODULE, SubProtocols),
      lager:info("Service manager: listening on ~s:~p", [IP, Port]),
      {ok, Pid}.
  
negative.code:             gen_server:start_link({local, ?SERVER}, ?MODULE, Args, Options)
      end.
  
  %% @doc Once a protocol specification is registered, it will be kept
  %% available by the Service Manager. Note that the callee is responsible
  %% for taking ownership of the socket via
  %% Transport:controlling_process(Socket, Pid).  Only the strategy of
  %% `round_robin' is supported; it's arg is ignored.
  -spec(register_service(hostspec(), service_scheduler_strategy()) -> ok).
  register_service(HostProtocol, Strategy) ->
      %% only one strategy is supported as yet
      {round_robin, _NB} = Strategy,
      gen_server:cast(?SERVER, {register_service, HostProtocol, Strategy}).
  
  %% @doc Blocking version of register_service.
  -spec sync_register_service(hostspec(), service_scheduler_strategy()) -> ok.
  sync_register_service(HostProtocol, Strategy) ->
      %% only one strategy is supported as yet
      {round_robin, _NB} = Strategy,
      gen_server:call(?SERVER, {register_service, HostProtocol, Strategy}).
  
  %% @doc Unregister the given protocol-id. Existing connections for this
  %% protocol are not killed. New connections for this protocol will not be
  