anchor.diff:      Options = [binary, {active, once}, {recbuf, RecBuf}],
       case gen_udp:open(Port, Options) of
   	{ok, Socket} ->
  -	    {ok, #state{socket = Socket}};
  +	    Methods = ets:new(osc_methods, [named_table, ordered_set]),
  +	    {ok, #state{socket = Socket, methods = Methods}};
   	{error, Reason} ->
   	    error_logger:error_report({?MODULE,udp_open,Reason}),
   	    {stop, Reason}
  
positive.code: 
  -define(SERVER, ?MODULE). 
  
  -record(state, {socket, methods = []}).
  
  %%%===================================================================
  %%% API
  
negative.code: %%% Internal functions
  %%%===================================================================
  handle_message(When, Address, Args, Methods) ->
      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;
  