anchor.diff:  	    find_failed
       end.
   
  +see(Commit, #cstate{table=Cache}) ->
  +    ets:insert(Cache, {Commit, seen}).
  +
  +seen(Commit, #cstate{table=Cache}) ->
  +    case ets:match(Cache, {Commit, seen}) of
  +	[[{Commit, seen}|_]] ->
  +	    true;
  +	_ ->
  +	    false
  +    end.
  +
   %% XXX:  after changing how cache_fetch works, there's no reason to keep both it and _find
   cache_fetch(Kind, Name, Commit, State) ->
       cache_fetch(Kind, Name, Commit, State, []).
   
  +cache_fetch(Kind, Name, Commit, State, Default) when not is_function(Default) ->
  +    cache_fetch(Kind, Name, Commit, State, fun(_,_) -> Default end);
   cache_fetch(Kind, Name, Commit, State, Default) ->
       case cache_find(Kind, Name, Commit, State) of
   	{value, Result} ->
   	    Result;
   	find_failed ->
  -	    Default
  +	    Default(Commit, State)
       end.
   
   generic_find(Kind, Name, Commit, CommitObj, State) ->
  
positive.code: generic_find(Kind, Name, Commit, CommitObj, State, Default) ->
      case cache_find(Kind, Name, Commit, State) of
  	{value, Config} ->
  	    {value, Config};
  	 find_failed ->
  	    calc_configs(Commit, CommitObj, State),
  	    cache_fetch(Kind, Name, Commit, State, Default)
      end.
  
negative.code: 
  -behaviour(gen_server).
  
  -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3, start_link/0]).
  
  -export([has/3, for/3, cache_dump/0, reset/0]).
  
  