anchor.diff:  -type broadcast_message() :: #broadcast{}.
   -type broadcast_id() :: id().
   -type broadcast_clock() :: clock().
  --type broadcast_payload() :: {id(), type(), metadata(), value(), var()}.
  +-type broadcast_payload() :: {id(), type(), metadata(), value()}.
   
   %% @doc Returns from the broadcast message the identifier and the payload.
   -spec broadcast_data(broadcast_message()) ->
  
positive.code: %% @private
  membership() ->
      lasp_peer_service:members().
  
  %% @private
  convergence() ->
      {ok, Convergence} = lasp:read(?CONVERGENCE_ID, undefined),
      lager:info("*** read: ~p", [Convergence]),
      Convergence.
  
  %% @private
  bind_convergence({Id, Type, Metadata, Value}) ->
      {ok, Result} = ?MODULE:local_bind(Id, Type, Metadata, Value),
      {ok, Result}.
  
negative.code:                           type=Type,
                            clock=Clock,
                            metadata=Metadata,
                            value=Value}) ->
      {{Id, Clock}, {Id, Type, Metadata, Value}}.
  
  %% @doc Perform a merge of an incoming object with an object in the
  %%      local datastore, as long as we haven't seen a more recent clock
  %%      for the same object.
  -spec merge({broadcast_id(), broadcast_clock()}, broadcast_payload()) ->
      boolean().
  merge({Id, Clock}, {Id, Type, Metadata, Value}) ->
      case is_stale({Id, Clock}) of
          true ->
              false;
          false ->
              %% Bind information.
              {ok, _} = ?MODULE:local_bind(Id, Type, Metadata, Value),
              true
      end;
  merge(BroadcastId, Payload) ->
      lager:error("Incoming merge didn't match; broadcast_id: ~p payload: ~p", [BroadcastId, Payload]),
      false.
  
  %% @doc Use the clock on the object to determine if this message is
  