anchor.diff:  
   -callback placement() -> erleans:grain_placement().
   
  --callback handle_call(Msg :: term(), From :: pid(), CbState :: cb_state()) ->
  -    {reply, Reply :: term(), CbState :: cb_state()} |
  -    {stop, Reason :: term(), Reply :: term(), CbState :: cb_state()}.
  -
  --callback handle_cast(Msg :: term(), CbState :: cb_state()) ->
  -    {noreply, CbState :: cb_state()} |
  -    {save, CbState :: cb_state()} |
  -    {save, Updates :: maps:map(), CbState :: cb_state()}.
  -
  --callback handle_info(Msg :: term(), CbState :: cb_state()) ->
  -    {noreply, CbState :: cb_state()} |
  -    {save, CbState :: cb_state()} |
  -    {save, Updates :: maps:map(), CbState :: cb_state()}.
  -
  --callback deactivate(CbState :: cb_state()) ->
  -    {ok, State :: cb_state()} |
  -    {save, State :: cb_state()} |
  -    {save, Updates :: maps:map(), CbState :: cb_state()}.
  +-callback handle_call(Msg :: term(), From :: pid(), CbData :: cb_state()) ->
  +    {reply, Reply :: term(), CbData :: cb_state()} |
  +    {reply, Reply :: term(), CbData :: cb_state(), [action()]} |
  +    {stop, Reason :: term(), Reply :: term(), CbData :: cb_state()}.
  +
  +-callback handle_cast(Msg :: term(), CbData :: cb_state()) ->
  +    {noreply, CbData :: cb_state()} |
  +    {save, CbData :: cb_state()} |
  +    {save, Updates :: maps:map(), CbData :: cb_state()}.
  +
  +-callback handle_info(Msg :: term(), CbData :: cb_state()) ->
  +    {noreply, CbData :: cb_state()} |
  +    {save, CbData :: cb_state()} |
  +    {save, Updates :: maps:map(), CbData :: cb_state()}.
  +
  +-callback deactivate(CbData :: cb_state()) ->
  +    {ok, Data :: cb_state()} |
  +    {save, Data :: cb_state()} |
  +    {save, Updates :: maps:map(), CbData :: cb_state()}.
   
   -optional_callbacks([provider/0,
                        placement/0]).
   
  --record(state,
  +-record(data,
          { cb_module            :: module(),
            cb_state             :: cb_state(),
   
  
positive.code:          unsubscribe/2]).
  
  -export([init/1,
           handle_call/3,
           handle_cast/2,
           handle_info/2,
           terminate/2,
           code_change/3]).
  
  -include("erleans.hrl").
  
  
negative.code: %%% ---------------------------------------------------------------------------
  -module(erleans_grain).
  
  -behaviour(gen_statem).
  
  -export([start_link/1,
           call/2,
  