anchor.diff:      Fun = binary_to_term(FunBin, [safe]),
       return(Fun(Data)).
   
  +%% send results back to wpool
  +-spec return(any()) -> ok.
   return(Data) ->
       MyPool = pid_groups:get_my(wpool),
       comm:send_local(MyPool, {data, self(), Data}).
  
positive.code:     ?TRACE("~200p~nwpool: unknown message~n", [Msg]),
      State.
  
  start_worker(Source, Workload, State) ->
      Sup = pid_groups:get_my(sup_wpool),
      case supervisor:start_child(Sup, {worker, {wpool, init_worker,
  
negative.code:                              [{pid_groups_join_as, DHTNodeGroup, wpool}]).
  
  -spec on(message(), state()) -> state().
  %% new job arrives...either start it right away or queue it
  on({do_work, Source, Workload}, {Max, Working, Waiting}) when
          length(Working) >= Max ->
      {Max, Working, lists:append(Waiting, [{Source, Workload}])};
  on({do_work, Source, Workload}, State) ->
      start_worker(Source, Workload, State);
  
  %% worker terminated; clear it from the working list and do error reporting if
  %% necessarry
  on({'DOWN', _Ref, process, Pid, Reason}, State) ->
      ?TRACE("worker finished with reason ~p~n", [Reason]),
      %% TODO in case of error send some report back
      cleanup_worker(Pid, State);
  
  %% worker sends results; forward to source
  on({data, Pid, Data}, {_Max, Working, _Waiting} = State) ->
      ?TRACE("wpool: received data from ~p:~n~p...~n",
              [Pid, lists:sublist(Data, 4)]),
  