sig
  module Oo :
    sig
      val copy : (< .. > as 'a) -> 'a
      external id : < .. > -> int = "%field1"
      val new_method : string -> CamlinternalOO.tag
      val public_method_label : string -> CamlinternalOO.tag
      module Internal :
        sig
          type tag = CamlinternalOO.tag
          type label = CamlinternalOO.label
          type table = CamlinternalOO.table
          type meth = CamlinternalOO.meth
          type t = CamlinternalOO.t
          type obj = CamlinternalOO.obj
          type closure = CamlinternalOO.closure
          val public_method_label : string -> BatOo.Oo.Internal.tag
          val new_method : BatOo.Oo.Internal.table -> BatOo.Oo.Internal.label
          val new_variable : BatOo.Oo.Internal.table -> string -> int
          val new_methods_variables :
            BatOo.Oo.Internal.table ->
            string array -> string array -> BatOo.Oo.Internal.label array
          val get_variable : BatOo.Oo.Internal.table -> string -> int
          val get_variables :
            BatOo.Oo.Internal.table -> string array -> int array
          val get_method_label :
            BatOo.Oo.Internal.table -> string -> BatOo.Oo.Internal.label
          val get_method_labels :
            BatOo.Oo.Internal.table ->
            string array -> BatOo.Oo.Internal.label array
          val get_method :
            BatOo.Oo.Internal.table ->
            BatOo.Oo.Internal.label -> BatOo.Oo.Internal.meth
          val set_method :
            BatOo.Oo.Internal.table ->
            BatOo.Oo.Internal.label -> BatOo.Oo.Internal.meth -> unit
          val set_methods :
            BatOo.Oo.Internal.table -> BatOo.Oo.Internal.label array -> unit
          val narrow :
            BatOo.Oo.Internal.table ->
            string array -> string array -> string array -> unit
          val widen : BatOo.Oo.Internal.table -> unit
          val add_initializer :
            BatOo.Oo.Internal.table ->
            (BatOo.Oo.Internal.obj -> unit) -> unit
          val dummy_table : BatOo.Oo.Internal.table
          val create_table : string array -> BatOo.Oo.Internal.table
          val init_class : BatOo.Oo.Internal.table -> unit
          val inherits :
            BatOo.Oo.Internal.table ->
            string array ->
            string array ->
            string array ->
            BatOo.Oo.Internal.t *
            (BatOo.Oo.Internal.table -> BatOo.Oo.Internal.obj -> Obj.t) *
            BatOo.Oo.Internal.t * BatOo.Oo.Internal.obj ->
            bool -> Obj.t array
          val make_class :
            string array ->
            (BatOo.Oo.Internal.table -> Obj.t -> BatOo.Oo.Internal.t) ->
            BatOo.Oo.Internal.t *
            (BatOo.Oo.Internal.table -> Obj.t -> BatOo.Oo.Internal.t) *
            (Obj.t -> BatOo.Oo.Internal.t) * Obj.t
          type init_table = CamlinternalOO.init_table
          val make_class_store :
            string array ->
            (BatOo.Oo.Internal.table -> BatOo.Oo.Internal.t) ->
            BatOo.Oo.Internal.init_table -> unit
          val dummy_class :
            string * int * int ->
            BatOo.Oo.Internal.t *
            (BatOo.Oo.Internal.table -> Obj.t -> BatOo.Oo.Internal.t) *
            (Obj.t -> BatOo.Oo.Internal.t) * Obj.t
          val copy : (< .. > as 'a) -> 'a
          val create_object :
            BatOo.Oo.Internal.table -> BatOo.Oo.Internal.obj
          val create_object_opt :
            BatOo.Oo.Internal.obj ->
            BatOo.Oo.Internal.table -> BatOo.Oo.Internal.obj
          val run_initializers :
            BatOo.Oo.Internal.obj -> BatOo.Oo.Internal.table -> unit
          val run_initializers_opt :
            BatOo.Oo.Internal.obj ->
            BatOo.Oo.Internal.obj ->
            BatOo.Oo.Internal.table -> BatOo.Oo.Internal.obj
          val create_object_and_run_initializers :
            BatOo.Oo.Internal.obj ->
            BatOo.Oo.Internal.table -> BatOo.Oo.Internal.obj
          external send :
            BatOo.Oo.Internal.obj ->
            BatOo.Oo.Internal.tag -> BatOo.Oo.Internal.t = "%send"
          external sendcache :
            BatOo.Oo.Internal.obj ->
            BatOo.Oo.Internal.tag ->
            BatOo.Oo.Internal.t -> int -> BatOo.Oo.Internal.t = "%sendcache"
          external sendself :
            BatOo.Oo.Internal.obj ->
            BatOo.Oo.Internal.label -> BatOo.Oo.Internal.t = "%sendself"
          external get_public_method :
            BatOo.Oo.Internal.obj ->
            BatOo.Oo.Internal.tag -> BatOo.Oo.Internal.closure
            = "caml_get_public_method" "noalloc"
          type tables = CamlinternalOO.tables
          val lookup_tables :
            BatOo.Oo.Internal.tables ->
            BatOo.Oo.Internal.closure array -> BatOo.Oo.Internal.tables
          type impl =
            CamlinternalOO.impl =
              GetConst
            | GetVar
            | GetEnv
            | GetMeth
            | SetVar
            | AppConst
            | AppVar
            | AppEnv
            | AppMeth
            | AppConstConst
            | AppConstVar
            | AppConstEnv
            | AppConstMeth
            | AppVarConst
            | AppEnvConst
            | AppMethConst
            | MethAppConst
            | MethAppVar
            | MethAppEnv
            | MethAppMeth
            | SendConst
            | SendVar
            | SendEnv
            | SendMeth
            | Closure of BatOo.Oo.Internal.closure
          type params =
            CamlinternalOO.params = {
            mutable compact_table : bool;
            mutable copy_parent : bool;
            mutable clean_when_copying : bool;
            mutable retry_count : int;
            mutable bucket_small_size : int;
          }
          val params : BatOo.Oo.Internal.params
          type stats =
            CamlinternalOO.stats = {
            classes : int;
            methods : int;
            inst_vars : int;
          }
          val stats : unit -> BatOo.Oo.Internal.stats
        end
    end
end