anchor.diff:  
   %% API
   -export([start_link/1, stop/0]).
  --export([get_user/1]).
  +-export([add_user/2, get_user/1]).
   -export([add_topic/2, get_topic/1]).
   -export([add_message/3, get_message/1]).
   
  
positive.code:         is_binary(Message#erlchat_message.topic_id) andalso
          Message#erlchat_message.topic_id =/= <<>> andalso
          is_binary(Message#erlchat_message.text) andalso
          Message#erlchat_message.text =/= <<>>.
  
  
negative.code: 
  add_topic(Users, Subject) ->
          Topic = #erlchat_topic{ users = Users, subject = Subject},
          execute_if_valid(Topic, fun() -> gen_server:call(?store_server, {add_topic, Topic}) end).
  
  get_topic(TopicId) ->
          gen_server:call(?store_server, {get_topic, TopicId}).
  
  add_message(Sender, TopicId, Text) ->
          Message = #erlchat_message { sender = Sender, topic_id = TopicId, text = Text },
          execute_if_valid(Message, fun() -> gen_server:call(?store_server, {add_message, Message}) end).
  
  get_message(MessageId) ->
          gen_server:call(?store_server, {get_message, MessageId}).
  
  add_user(Nickname, Avatar) ->
          User = #erlchat_user{ nickname = Nickname, avatar = Avatar },
          execute_if_valid(User, fun() -> gen_server:call(?store_server, {add_user, User}) end).
  
  get_user(UserId) ->
          gen_server:call(?store_server, {get_user, UserId}).
  
  execute_if_valid(Data, HappyPath) ->
          case is_valid(Data) of
            true ->
              HappyPath();
            false ->
              {error, invalid_data}
          end.
  
  is_valid(Topic=#erlchat_topic{}) ->
          is_list(Topic#erlchat_topic.users) andalso
  