anchor.diff:  %%      of 50 per second at most:
   %%      ``recon_trace:calls({queue, '_', '_'}, {50,1000}, [{pid, Pid}])''</li>
   %%  <li>Print the traces with the function arity instead of literal arguments:
  -%%      `recon_trace:calls(MFA, Max, [{args, arity}])'</li>
  +%%      `recon_trace:calls(TSpec, Max, [{args, arity}])'</li>
   %%  <li>Matching the `filter/2' functions of both `dict' and `lists' modules,
   %%      across new processes only:
   %%      `recon_trace:calls([{dict,filter,2},{lists,filter,2}], 10, [{pid, new]})'</li>
  
positive.code:     %% has to be `recon:pid_term()'.
      [recon_lib:term_to_pid(PidTerm)].
  
  validate_mfa(Mod, Fun, Args) when is_function(Args) ->
      validate_mfa(Mod, Fun, fun_to_ms(Args));
  validate_mfa(Mod, Fun, Args) ->
      BannedMods = ['_', ?MODULE, io, lists],
      %% The banned mod check can be bypassed by using
      %% match specs if you really feel like being dumb.
  
negative.code: %% can be risky if more trace messages are generated than any process on
  %% the node could ever handle, despite the precautions taken by this library.
  %% @end
  -spec calls(tspec() | [tspec(),...], max(), options()) -> num_matches().
  calls({Mod, Fun, Args}, Max, Opts) ->
      calls([{Mod,Fun,Args}], Max,Opts);
  calls(TSpecs = [_|_], {Max, Time}, Opts) ->
      Pid = setup(rate_tracer, [Max, Time]),
      trace_calls(TSpecs, Pid, Opts);
  calls(TSpecs = [_|_], Max, Opts) ->
      Pid = setup(count_tracer, [Max]),
      trace_calls(TSpecs, Pid, Opts).
  
  %%%%%%%%%%%%%%%%%%%%%%%
  %%% PRIVATE EXPORTS %%%
  