functor (D : DISPOSABLE->
  sig
    type data = D.t
    val register : (data -> unit) -> data -> data
    val manage : ?disposer:(data -> unit) -> data -> data
    val dispose : data -> unit
  end