sig
  module Priority : sig type t = int 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
  type invalid = [ `Invalid ]
  type fail = [ `Fail ]
  type error = [ `Error ]
  type warn = [ `Warn ]
  type notice = [ `Notice ]
  type info = [ `Info ]
  type debug = [ `Debug ]
  type basic =
      [ `Debug | `Error | `Fail | `Info | `Invalid | `Notice | `Warn ]
  type enable = [ `All | `None ]
  type level =
      [ `All
      | `Debug
      | `Error
      | `Fail
      | `Info
      | `Invalid
      | `None
      | `Notice
      | `Warn ]
end