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