anchor.diff:      {Order, OldNode, _OldOpts} = lists:keyfind(OldNode, 2, OldNodes),
       NewNodes = lists:keyreplace(OldNode, 2, OldNodes, {Order, node(), NewOpts}),
       int_join([], OldState#mem{nodes=NewNodes});
  -
  +% leave
   handle_join(leave, [_OldNode | _], _PingNode, _State) ->
       % TODO implement me
       ok;
  
positive.code:     end,
      % now use this info to join the ring
      int_join(ExtNodes, NewState);
  
  handle_join(replace, OldNode, PingNode, State) when is_atom(OldNode) ->
      handle_join(replace, {OldNode, []}, PingNode, State);
  handle_join(replace, [OldNode | _], PingNode, State) ->
  
negative.code: 
  
  %% @doc handle join activities, return {ok,NewState}
  -spec handle_join(join_type(), [mem_node()], ping_node(), mem_state()) ->
               {ok, mem_state()}.
  % init
  handle_join(init, ExtNodes, nil, State) ->
      {_,Nodes,_} = lists:unzip3(ExtNodes),
      ping_all_yall(Nodes),
      int_join(ExtNodes, State);
  % join
  handle_join(join, ExtNodes, PingNode, #mem{args=Args} = State) ->
      NewState = case get_test(Args) of
      undefined -> get_pingnode_state(PingNode);
  