functor (P : Cf_ordered.Total_T) ->
  sig
    module Priority : sig type t = P.t val compare : t -> t -> int end
    class virtual ['a] prioritizer :
      object
        method virtual code : 'a -> Priority.t
        method virtual tag : 'a -> string
      end
    class ['a] event :
      'a #prioritizer ->
      'a ->
      string ->
      object
        method level : 'a
        method message : string
        method prioritizer : 'a prioritizer
      end
    class virtual ['a] archiver :
      object constraint 'a = 'b #event method virtual emit : 'a -> unit end
    class virtual ['a] agent :
      'b #prioritizer ->
      'b ->
      'a list ->
      object
        constraint 'a = ('b #event as 'c) #archiver
        val mutable archivers_ : 'a list
        val mutable limit_ : Priority.t
        method enabled : 'b -> bool
        method private virtual event : 'b -> string -> 'c
        method private put :
          'd 'e. 'b -> ('c -> 'e) -> ('d, unit, string, 'e) format4 -> 'd
        method setlimit : 'b -> unit
      end
  end