sig
  type op = string * string list
  type op_lst = Ldap_ooclient.op list
  type referral_policy = [ `FOLLOW | `RETURN ]
  type changetype = [ `ADD | `DELETE | `MODDN | `MODIFY | `MODRDN ]
  class type ldapentry_t =
    object
      method add : Ldap_ooclient.op_lst -> unit
      method attributes : string list
      method changes : (Ldap_types.modify_optype * string * string list) list
      method changetype : Ldap_ooclient.changetype
      method delete : Ldap_ooclient.op_lst -> unit
      method diff :
        Ldap_ooclient.ldapentry_t ->
        (Ldap_types.modify_optype * string * string list) list
      method dn : string
      method exists : string -> bool
      method flush_changes : unit
      method get_value : string -> string list
      method modify :
        (Ldap_types.modify_optype * string * string list) list -> unit
      method print : unit
      method replace : Ldap_ooclient.op_lst -> unit
      method set_changetype : Ldap_ooclient.changetype -> unit
      method set_dn : string -> unit
    end
  class ldapentry :
    object
      method add : Ldap_ooclient.op_lst -> unit
      method attributes : string list
      method changes : (Ldap_types.modify_optype * string * string list) list
      method changetype : Ldap_ooclient.changetype
      method delete : Ldap_ooclient.op_lst -> unit
      method diff :
        Ldap_ooclient.ldapentry_t ->
        (Ldap_types.modify_optype * string * string list) list
      method dn : string
      method exists : string -> bool
      method flush_changes : unit
      method get_value : string -> string list
      method modify :
        (Ldap_types.modify_optype * string * string list) list -> unit
      method print : unit
      method replace : Ldap_ooclient.op_lst -> unit
      method set_changetype : Ldap_ooclient.changetype -> unit
      method set_dn : string -> unit
    end
  val format_entry :
    < attributes : string list; dn : string;
      get_value : string -> string list; .. > ->
    unit
  val format_entries :
    < attributes : string list; dn : string;
      get_value : string -> string list; .. >
    list -> unit
  type changerec =
    [ `Addition of Ldap_ooclient.ldapentry
    | `Delete of string
    | `Modification of
        string * (Ldap_types.modify_optype * string * string list) list
    | `Modrdn of string * int * string ]
  val to_entry :
    [< `Entry of Ldap_types.search_result_entry | `Referral of string list ] ->
    Ldap_ooclient.ldapentry
  val of_entry : Ldap_ooclient.ldapentry -> Ldap_types.search_result_entry
  class ldapcon :
    ?connect_timeout:int ->
    ?referral_policy:[> `RETURN ] ->
    ?version:int ->
    string list ->
    object
      method add : Ldap_ooclient.ldapentry -> unit
      method bind :
        ?cred:string -> ?meth:Ldap_funclient.authmethod -> string -> unit
      method delete : string -> unit
      method modify :
        string ->
        (Ldap_types.modify_optype * string * string list) list -> unit
      method modrdn :
        string ->
        ?deleteoldrdn:bool -> ?newsup:string option -> string -> unit
      method rawschema : Ldap_ooclient.ldapentry
      method schema : Ldap_schemaparser.schema
      method search :
        ?scope:Ldap_types.search_scope ->
        ?attrs:string list ->
        ?attrsonly:bool ->
        ?base:string -> string -> Ldap_ooclient.ldapentry list
      method search_a :
        ?scope:Ldap_types.search_scope ->
        ?attrs:string list ->
        ?attrsonly:bool ->
        ?base:string ->
        string -> ?abandon:bool -> unit -> Ldap_ooclient.ldapentry
      method unbind : unit
      method update_entry : Ldap_ooclient.ldapentry -> unit
    end
  val iter :
    (Ldap_ooclient.ldapentry -> unit) ->
    (?abandon:bool -> unit -> Ldap_ooclient.ldapentry) -> unit
  val rev_map :
    (Ldap_ooclient.ldapentry -> 'a) ->
    (?abandon:bool -> unit -> Ldap_ooclient.ldapentry) -> 'a list
  val map :
    (Ldap_ooclient.ldapentry -> 'a) ->
    (?abandon:bool -> unit -> Ldap_ooclient.ldapentry) -> 'a list
  val fold :
    (Ldap_ooclient.ldapentry -> '-> 'a) ->
    '-> (?abandon:bool -> unit -> Ldap_ooclient.ldapentry) -> 'a
  module OrdOid :
    sig
      type t = Ldap_schemaparser.Oid.t
      val compare : Ldap_ooclient.OrdOid.t -> Ldap_ooclient.OrdOid.t -> int
    end
  module Setstr :
    sig
      type elt = Ldap_ooclient.OrdOid.t
      type t = Set.Make(OrdOid).t
      val empty : Ldap_ooclient.Setstr.t
      val is_empty : Ldap_ooclient.Setstr.t -> bool
      val mem : Ldap_ooclient.Setstr.elt -> Ldap_ooclient.Setstr.t -> bool
      val add :
        Ldap_ooclient.Setstr.elt ->
        Ldap_ooclient.Setstr.t -> Ldap_ooclient.Setstr.t
      val singleton : Ldap_ooclient.Setstr.elt -> Ldap_ooclient.Setstr.t
      val remove :
        Ldap_ooclient.Setstr.elt ->
        Ldap_ooclient.Setstr.t -> Ldap_ooclient.Setstr.t
      val union :
        Ldap_ooclient.Setstr.t ->
        Ldap_ooclient.Setstr.t -> Ldap_ooclient.Setstr.t
      val inter :
        Ldap_ooclient.Setstr.t ->
        Ldap_ooclient.Setstr.t -> Ldap_ooclient.Setstr.t
      val diff :
        Ldap_ooclient.Setstr.t ->
        Ldap_ooclient.Setstr.t -> Ldap_ooclient.Setstr.t
      val compare : Ldap_ooclient.Setstr.t -> Ldap_ooclient.Setstr.t -> int
      val equal : Ldap_ooclient.Setstr.t -> Ldap_ooclient.Setstr.t -> bool
      val subset : Ldap_ooclient.Setstr.t -> Ldap_ooclient.Setstr.t -> bool
      val iter :
        (Ldap_ooclient.Setstr.elt -> unit) -> Ldap_ooclient.Setstr.t -> unit
      val fold :
        (Ldap_ooclient.Setstr.elt -> '-> 'a) ->
        Ldap_ooclient.Setstr.t -> '-> 'a
      val for_all :
        (Ldap_ooclient.Setstr.elt -> bool) -> Ldap_ooclient.Setstr.t -> bool
      val exists :
        (Ldap_ooclient.Setstr.elt -> bool) -> Ldap_ooclient.Setstr.t -> bool
      val filter :
        (Ldap_ooclient.Setstr.elt -> bool) ->
        Ldap_ooclient.Setstr.t -> Ldap_ooclient.Setstr.t
      val partition :
        (Ldap_ooclient.Setstr.elt -> bool) ->
        Ldap_ooclient.Setstr.t ->
        Ldap_ooclient.Setstr.t * Ldap_ooclient.Setstr.t
      val cardinal : Ldap_ooclient.Setstr.t -> int
      val elements : Ldap_ooclient.Setstr.t -> Ldap_ooclient.Setstr.elt list
      val min_elt : Ldap_ooclient.Setstr.t -> Ldap_ooclient.Setstr.elt
      val max_elt : Ldap_ooclient.Setstr.t -> Ldap_ooclient.Setstr.elt
      val choose : Ldap_ooclient.Setstr.t -> Ldap_ooclient.Setstr.elt
      val split :
        Ldap_ooclient.Setstr.elt ->
        Ldap_ooclient.Setstr.t ->
        Ldap_ooclient.Setstr.t * bool * Ldap_ooclient.Setstr.t
    end
  type scflavor = Optimistic | Pessimistic
  val attrToOid :
    Ldap_schemaparser.schema ->
    Ldap_schemaparser.Lcstring.t -> Ldap_schemaparser.Oid.t
  val oidToAttr :
    Ldap_schemaparser.schema -> Ldap_schemaparser.Oid.t -> string
  val ocToOid :
    Ldap_schemaparser.schema ->
    Ldap_schemaparser.Lcstring.t -> Ldap_schemaparser.Oid.t
  val oidToOc : Ldap_schemaparser.schema -> Ldap_schemaparser.Oid.t -> string
  val getOc :
    Ldap_schemaparser.schema ->
    Ldap_schemaparser.Lcstring.t -> Ldap_schemaparser.objectclass
  val getAttr :
    Ldap_schemaparser.schema ->
    Ldap_schemaparser.Lcstring.t -> Ldap_schemaparser.attribute
  val equateAttrs :
    Ldap_schemaparser.schema ->
    Ldap_schemaparser.Lcstring.t -> Ldap_schemaparser.Lcstring.t -> bool
  exception Invalid_objectclass of string
  exception Invalid_attribute of string
  exception Single_value of string
  exception Objectclass_is_required
  class scldapentry :
    Ldap_schemaparser.schema ->
    object
      method add : Ldap_ooclient.op_lst -> unit
      method attributes : string list
      method changes : (Ldap_types.modify_optype * string * string list) list
      method changetype : Ldap_ooclient.changetype
      method delete : Ldap_ooclient.op_lst -> unit
      method diff :
        Ldap_ooclient.ldapentry_t ->
        (Ldap_types.modify_optype * string * string list) list
      method dn : string
      method exists : string -> bool
      method flush_changes : unit
      method get_value : string -> string list
      method is_allowed : string -> bool
      method is_missing : string -> bool
      method list_allowed : Ldap_ooclient.Setstr.elt list
      method list_missing : Ldap_ooclient.Setstr.elt list
      method list_present : Ldap_ooclient.Setstr.elt list
      method modify :
        (Ldap_types.modify_optype * string * string list) list -> unit
      method of_entry :
        ?scflavor:Ldap_ooclient.scflavor -> Ldap_ooclient.ldapentry -> unit
      method print : unit
      method replace : Ldap_ooclient.op_lst -> unit
      method set_changetype : Ldap_ooclient.changetype -> unit
      method set_dn : string -> unit
    end
  type generator = {
    gen_name : string;
    required : string list;
    genfun : Ldap_ooclient.ldapentry_t -> string list;
  }
  type service = {
    svc_name : string;
    static_attrs : (string * string list) list;
    generate_attrs : string list;
    depends : string list;
  }
  type generation_error =
      Missing_required of string list
    | Generator_error of string
  exception No_generator of string
  exception Generation_failed of Ldap_ooclient.generation_error
  exception No_service of string
  exception Service_dep_unsatisfiable of string
  exception Generator_dep_unsatisfiable of string * string
  exception Cannot_sort_dependancies of string list
  class ldapaccount :
    Ldap_schemaparser.schema ->
    (string, Ldap_ooclient.generator) Hashtbl.t ->
    (string, Ldap_ooclient.service) Hashtbl.t ->
    object
      method adapt_service : Ldap_ooclient.service -> Ldap_ooclient.service
      method add : Ldap_ooclient.op_lst -> unit
      method add_generate : string -> unit
      method add_service : string -> unit
      method attributes : string list
      method changes : (Ldap_types.modify_optype * string * string list) list
      method changetype : Ldap_ooclient.changetype
      method delete : Ldap_ooclient.op_lst -> unit
      method delete_generate : string -> unit
      method delete_service : string -> unit
      method diff :
        Ldap_ooclient.ldapentry_t ->
        (Ldap_types.modify_optype * string * string list) list
      method dn : string
      method exists : string -> bool
      method flush_changes : unit
      method generate : unit
      method get_value : string -> string list
      method is_allowed : string -> bool
      method is_missing : string -> bool
      method list_allowed : Ldap_ooclient.Setstr.elt list
      method list_missing : Ldap_ooclient.Setstr.elt list
      method list_present : Ldap_ooclient.Setstr.elt list
      method modify :
        (Ldap_types.modify_optype * string * string list) list -> unit
      method of_entry :
        ?scflavor:Ldap_ooclient.scflavor -> Ldap_ooclient.ldapentry -> unit
      method print : unit
      method replace : Ldap_ooclient.op_lst -> unit
      method service_exists : string -> bool
      method services_present : string list
      method set_changetype : Ldap_ooclient.changetype -> unit
      method set_dn : string -> unit
    end
end