anchor.diff:            id :: term(),
             duration_ns :: pos_integer(),
             deadline_ns :: timestamp(),
  -          generation :: non_neg_integer(),
  -          skip_missed :: boolean()
  +          generation :: non_neg_integer()
   }).
   -type tick() :: #tick{}.
   
  
positive.code:            {error, {already_started, pid()}} |
             {error, Reason :: term()}.
  start(Name, Mod, Args, Options) ->
      {TickedGServerOptions, GenServerOptions} = split_start_options(Options),
      gen_server:start(Name, ?MODULE, {Mod, Args, TickedGServerOptions}, GenServerOptions).
  
  -spec start_link(Mod :: module(), Args :: term(), Options :: [start_option()])
          -> {ok, pid()} |
             {error, {already_started, pid()}} |
             {error, Reason :: term()}.
  start_link(Mod, Args, Options) ->
      {TickedGServerOptions, GenServerOptions} = split_start_options(Options),
      gen_server:start_link(?MODULE, {Mod, Args, TickedGServerOptions}, GenServerOptions).
  
  -spec start_link(Name :: {local, atom()} | {global, atom()} | {via, atom(), term()},
                   Mod :: module(), Args :: term(), Options :: [start_option()])
  
negative.code:            {error, {already_started, pid()}} |
             {error, Reason :: term()}.
  start_link(Name, Mod, Args, Options) ->
      {TickOptions, GenServerOptions} = split_start_options(Options),
      gen_server:start_link(Name, ?MODULE, {Mod, Args, TickOptions}, GenServerOptions).
  
  %% ------------------------------------------------------------------
  %% gen_server Function Definitions
  %% ------------------------------------------------------------------
  
  -spec init({Mod :: module(), Args :: term(), TickOptions :: [{ticks, tick_start_option()}]})
          -> {ok, State :: term(), Timeout :: non_neg_integer()} |
             {stop, Reason :: term()} | ignore.
  init({Mod, Args, TickOptions}) ->
      NowNS = now_timestamp_ns(),
      TickSettings = proplists:get_value(ticks, TickOptions, []),
      Ticks = lists:map(
                fun ({TickId, TickDurationMS}) ->
                        #tick{id = TickId,
                              duration_ns = TickDurationMS * 1000000,
                              deadline_ns = NowNS,
                              generation = 0}
                end,
                TickSettings),
      undefined = put(?PROCDIC_MODULE, Mod),
      undefined = put(?PROCDIC_TICKS, Ticks),
      inject_init_timeout(Mod:init(Args)).
  