anchor.diff:                                      match(TIn, T)
                               end).
   
  -topic(User, ClientId, Topic) ->
  -    subst(?USER_SUP, ?CLIENT_SUP, User, ClientId, Topic, []).
  -
  -subst(U, C, User, ClientId, [U|Rest], Acc) ->
  -    subst(U, C, User, ClientId, Rest, [User|Acc]);
  -subst(U, C, User, ClientId, [C|Rest], Acc) ->
  -    subst(U, C, User, ClientId, Rest, [ClientId|Acc]);
  -subst(U, C, User, ClientId, [W|Rest], Acc) ->
  -    subst(U, C, User, ClientId, Rest, [W|Acc]);
  -subst(_, _, _, _, [], Acc) -> lists:reverse(Acc).
  +topic(User, {MP, ClientId}, Topic) ->
  +    subst(list_to_binary(MP), User, ClientId, Topic, []).
  +
  +subst(MP, User, ClientId, [U|Rest], Acc) when U == ?USER_SUP ->
  +    subst(MP, User, ClientId, Rest, [User|Acc]);
  +subst(MP, User, ClientId, [C|Rest], Acc) when C == ?CLIENT_SUP ->
  +    subst(MP, User, ClientId, Rest, [ClientId|Acc]);
  +subst(MP, User, ClientId, [M|Rest], Acc) when M == ?MOUNTPOINT_SUP ->
  +    subst(MP, User, ClientId, Rest, [MP|Acc]);
  +subst(MP, User, ClientId, [W|Rest], Acc) ->
  +    subst(MP, User, ClientId, Rest, [W|Acc]);
  +subst(_, _, _, [], Acc) -> lists:reverse(Acc).
   
   in(Type, User, Topic) when is_binary(Topic) ->
       TopicLen = byte_size(Topic) -1,
  
positive.code: iterate(T, Fun, K) ->
      Fun(K),
      iterate(T, Fun, ets:next(T, K)).
  
negative.code: -define(TABLE_OPTS, [public, named_table, {read_concurrency, true}]).
  -define(USER_SUP, <<"%u">>).
  -define(CLIENT_SUP, <<"%c">>).
  -define(MOUNTPOINT_SUP, <<"%m">>).
  
  -ifdef(TEST).
  -include_lib("eunit/include/eunit.hrl").
  -define(setup(F), {setup, fun setup/0, fun teardown/1, F}).
  -endif.
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  %%% Plugin Callbacks
  