functor (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 : '-> 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 :
          ''b. 'level -> ('-> 'b) -> ('a, unit, string, 'b) format4 -> 'a
        method setlimit : 'level -> unit
      end
  end