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