sig
  type param
  type result
  val apply : param -> result
  val is_empty : unit -> bool
  val clear : unit -> unit
  val length : unit -> int
  type key
  type id
  val register_key : Hook.S_ordered.key -> Hook.S_ordered.id
  val extend : Hook.S_ordered.id -> (param -> result) -> unit
  val extend_once : Hook.S_ordered.id -> (param -> result) -> unit
  val add_dependency : Hook.S_ordered.id -> Hook.S_ordered.id -> unit
end