anchor.diff:  
   %%% API functions
   
  +has(Kind, Name, Commit) ->
  +    gen_server:call(?SERVER, {has_config, Kind, Name, Commit}).
  +
  +
   for(Kind, Name, Commit) ->
       gen_server:call(?SERVER, {config_for, Kind, Name, Commit}).
   
  
positive.code: 	    find_failed
      end.
  
  cache_fetch(Kind, Name, Commit, State) ->
      {value, Result} = cache_find(Kind, Name, Commit, State),
      Result.
  
  generic_find(Kind, Name, Commit, State) ->
      case cache_find(Kind, Name, Commit, State) of
  	{value, Config} ->
  	    {value, Config};
  	 find_failed ->
  	    calc_configs(Commit, State),
  	    cache_fetch(Kind, Name, Commit, State)
      end.
  
negative.code: 
  %%% helpers
  
  generic_lookup(Kind, Name, Commit, #cstate{storage=StoreMod}=State, Default) ->
      CommitObj = StoreMod:find_commit(canonicalize_hash(Commit)),
      case CommitObj of
  	{wallaroo_commit, _} ->
  	    generic_find(Kind, Name, CommitObj, State, Default);
  	_ ->
  	    {error, {bad_commit, Commit, CommitObj}}
      end.
  
  
  %% XXX: refactor dupes plz
  canonicalize_hash(String) when is_list(String) ->
      wallaroo_hash:hash_to_bitstring(String);
  canonicalize_hash(BS) when is_binary(BS) ->
      BS.
  
  transitively_reachable(Graph, StartNode) ->
      ordsets:from_list(digraph_utils:reachable_neighbours([StartNode], Graph)).
  
  