functor (K : Key)
  (D : sig
         type key = K.t
         type data
         val name : string
         val basename : key -> string
         val compile : key -> string -> data
       end)
  ->
  sig
    type key = D.key
    type data = D.data
    val get : key -> data
    val mem : key -> bool
    val clear : unit -> unit
    val remove : key -> unit
  end