anchor.diff:  %%% Internal functions
   %%%===================================================================
   handle_message(When, Address, Args, Methods) ->
  -    case lists:keysearch(Address, 1, Methods) of
  -	{value, {Address, Module, Function}} ->
  -	    Time = when_to_msec(When),
  -	    timer:apply_after(Time, Module, Function, Args);
  -	false ->
  -	    error_logger:info_report({unhandled,{message,Address,Args}})
  +    case ets:match(Methods, make_pattern(Address)) of
  +	[] ->
  +	    error_logger:info_report({unhandled,{message,Address,Args}});
  +	Matches ->
  +	    [timer:apply_after(when_to_msec(When), Module, Function, Args) ||
  +		[{Module, Function}] <- Matches]
       end.
  +
  +make_pattern(Address) ->
  +    make_pattern(string:tokens(Address, "/"), []).
  +
  +make_pattern([], Acc) ->
  +    {lists:reverse(Acc), '$1'};
  +make_pattern(["*"], Acc) ->
  +    {lists:reverse(Acc) ++ '_', '$1'};
  +make_pattern([H|T], Acc) ->
  +    make_pattern(T, [make_pattern2(H, [])|Acc]).
  +
  +make_pattern2([], Acc) ->
  +    lists:reverse(Acc);
  +make_pattern2([$*|_], Acc) ->
  +    lists:reverse(Acc) ++ '_';
  +make_pattern2([$?|T], Acc) ->
  +    make_pattern2(T, ['_'|Acc]);
  +make_pattern2([H|T], Acc) ->
  +    make_pattern2(T, [H|Acc]).
   
   when_to_msec(immediately) ->
       0;
  
positive.code:     Options = [binary, {active, once}, {recbuf, RecBuf}],
      case gen_udp:open(Port, Options) of
  	{ok, Socket} ->
  	    {ok, #state{socket = Socket}};
  	{error, Reason} ->
  	    error_logger:error_report({?MODULE,udp_open,Reason}),
  	    {stop, Reason}
  
negative.code: 
  -define(SERVER, ?MODULE). 
  
  -record(state, {socket, methods}).
  
  %%%===================================================================
  %%% API
  