sig
  type -'a obj
  type g_type
  type g_class
  type g_value
  type g_closure
  type basic =
      [ `BOOL of bool
      | `CAML of Obj.t
      | `CHAR of char
      | `FLOAT of float
      | `INT of int
      | `INT64 of int64
      | `POINTER of Gpointer.boxed option
      | `STRING of string option ]
  type data_get =
      [ `BOOL of bool
      | `CAML of Obj.t
      | `CHAR of char
      | `FLOAT of float
      | `INT of int
      | `INT64 of int64
      | `NONE
      | `OBJECT of unit Gobject.obj option
      | `POINTER of Gpointer.boxed option
      | `STRING of string option ]
  type 'a data_set =
      [ `BOOL of bool
      | `CAML of Obj.t
      | `CHAR of char
      | `FLOAT of float
      | `INT of int
      | `INT32 of int32
      | `INT64 of int64
      | `LONG of nativeint
      | `OBJECT of 'Gobject.obj option
      | `POINTER of Gpointer.boxed option
      | `STRING of string option ]
  type base_data =
      [ `BOOLEAN
      | `BOXED
      | `CHAR
      | `DOUBLE
      | `ENUM
      | `FLAGS
      | `FLOAT
      | `INT
      | `INT64
      | `LONG
      | `OBJECT
      | `POINTER
      | `STRING
      | `UCHAR
      | `UINT
      | `UINT64
      | `ULONG ]
  type data_kind =
      [ `BOOLEAN
      | `BOXED
      | `CHAR
      | `DOUBLE
      | `ENUM
      | `FLAGS
      | `FLOAT
      | `INT
      | `INT32
      | `INT64
      | `LONG
      | `OBJECT
      | `OTHER of Gobject.g_type
      | `POINTER
      | `STRING
      | `UCHAR
      | `UINT
      | `UINT32
      | `UINT64
      | `ULONG ]
  type data_conv_get =
      [ `BOOL of bool
      | `CAML of Obj.t
      | `CHAR of char
      | `FLOAT of float
      | `INT of int
      | `INT32 of int32
      | `INT64 of int64
      | `NONE
      | `OBJECT of unit Gobject.obj option
      | `POINTER of Gpointer.boxed option
      | `STRING of string option ]
  type 'a data_conv = {
    kind : Gobject.data_kind;
    proj : Gobject.data_conv_get -> 'a;
    inj : '-> unit Gobject.data_set;
  }
  type ('a, 'b) property = { name : string; conv : 'Gobject.data_conv; }
  type fundamental_type =
      [ `BOOLEAN
      | `BOXED
      | `CHAR
      | `DOUBLE
      | `ENUM
      | `FLAGS
      | `FLOAT
      | `INT
      | `INT64
      | `INTERFACE
      | `INVALID
      | `LONG
      | `NONE
      | `OBJECT
      | `PARAM
      | `POINTER
      | `STRING
      | `UCHAR
      | `UINT
      | `UINT64
      | `ULONG ]
  exception Cannot_cast of string * string
  val get_type : 'Gobject.obj -> Gobject.g_type
  val is_a : 'Gobject.obj -> string -> bool
  val try_cast : 'Gobject.obj -> string -> 'Gobject.obj
  val get_oid : 'Gobject.obj -> int
  external unsafe_cast : 'Gobject.obj -> 'Gobject.obj = "%identity"
  external coerce : 'Gobject.obj -> unit Gobject.obj = "%identity"
  external coerce_option : 'Gobject.obj option -> unit Gobject.obj option
    = "%identity"
  type +'a param
  val dyn_param : string -> 'Gobject.data_set -> 'Gobject.param
  val param : ('a, 'b) Gobject.property -> '-> 'Gobject.param
  val unsafe_create :
    classe:string -> 'Gobject.param list -> 'Gobject.obj
  val unsafe_unref : 'Gobject.obj -> unit
  val get_ref_count : 'Gobject.obj -> int
  val set : ('a, 'b) Gobject.property -> 'Gobject.obj -> '-> unit
  val get : ('a, 'b) Gobject.property -> 'Gobject.obj -> 'b
  val set_params : 'Gobject.obj -> 'Gobject.param list -> unit
  module Type :
    sig
      val init : unit -> unit
      val name : Gobject.g_type -> string
      val from_name : string -> Gobject.g_type
      val parent : Gobject.g_type -> Gobject.g_type
      val depth : Gobject.g_type -> int
      val is_a : Gobject.g_type -> Gobject.g_type -> bool
      val fundamental : Gobject.g_type -> Gobject.fundamental_type
      val of_fundamental : Gobject.fundamental_type -> Gobject.g_type
      val interface_prerequisites : Gobject.g_type -> Gobject.g_type list
      val register_static :
        parent:Gobject.g_type -> name:string -> Gobject.g_type
      val caml : Gobject.g_type
    end
  module Value :
    sig
      val create_empty : unit -> Gobject.g_value
      val init : Gobject.g_value -> Gobject.g_type -> unit
      val create : Gobject.g_type -> Gobject.g_value
      val release : Gobject.g_value -> unit
      val get_type : Gobject.g_value -> Gobject.g_type
      val copy : Gobject.g_value -> Gobject.g_value -> unit
      val reset : Gobject.g_value -> unit
      val type_compatible : Gobject.g_type -> Gobject.g_type -> bool
      val type_transformable : Gobject.g_type -> Gobject.g_type -> bool
      val transform : Gobject.g_value -> Gobject.g_value -> bool
      val get : Gobject.g_value -> Gobject.data_get
      val set : Gobject.g_value -> 'Gobject.data_set -> unit
      val get_pointer : Gobject.g_value -> Gpointer.boxed
      val get_nativeint : Gobject.g_value -> nativeint
      val get_int32 : Gobject.g_value -> int32
      val get_conv :
        Gobject.data_kind -> Gobject.g_value -> Gobject.data_conv_get
    end
  module Closure :
    sig
      type args
      type argv = {
        result : Gobject.g_value;
        nargs : int;
        args : Gobject.Closure.args;
      }
      val create : (Gobject.Closure.argv -> unit) -> Gobject.g_closure
      val nth : Gobject.Closure.argv -> pos:int -> Gobject.g_value
      val result : Gobject.Closure.argv -> Gobject.g_value
      val get_result_type : Gobject.Closure.argv -> Gobject.g_type
      val get_type : Gobject.Closure.argv -> pos:int -> Gobject.g_type
      val get : Gobject.Closure.argv -> pos:int -> Gobject.data_get
      val set_result : Gobject.Closure.argv -> 'Gobject.data_set -> unit
      val get_args : Gobject.Closure.argv -> Gobject.data_get list
      val get_pointer : Gobject.Closure.argv -> pos:int -> Gpointer.boxed
      val get_nativeint : Gobject.Closure.argv -> pos:int -> nativeint
      val get_int32 : Gobject.Closure.argv -> pos:int -> int32
    end
  module Data :
    sig
      val boolean : bool Gobject.data_conv
      val char : char Gobject.data_conv
      val uchar : char Gobject.data_conv
      val int : int Gobject.data_conv
      val uint : int Gobject.data_conv
      val long : int Gobject.data_conv
      val ulong : int Gobject.data_conv
      val flags :
        ([>  ] as 'a) Gpointer.variant_table -> 'a list Gobject.data_conv
      val enum : ([>  ] as 'a) Gpointer.variant_table -> 'Gobject.data_conv
      val int32 : int32 Gobject.data_conv
      val uint32 : int32 Gobject.data_conv
      val int64 : int64 Gobject.data_conv
      val uint64 : int64 Gobject.data_conv
      val float : float Gobject.data_conv
      val double : float Gobject.data_conv
      val string : string Gobject.data_conv
      val string_option : string option Gobject.data_conv
      val pointer : Gpointer.boxed option Gobject.data_conv
      val unsafe_pointer : 'Gobject.data_conv
      val unsafe_pointer_option : 'a option Gobject.data_conv
      val boxed : Gobject.g_type -> Gpointer.boxed option Gobject.data_conv
      val unsafe_boxed : Gobject.g_type -> 'Gobject.data_conv
      val unsafe_boxed_option : Gobject.g_type -> 'a option Gobject.data_conv
      val gobject : 'Gobject.obj Gobject.data_conv
      val gobject_option : 'Gobject.obj option Gobject.data_conv
      val gobject_by_name : string -> 'Gobject.obj Gobject.data_conv
      val caml : 'Gobject.data_conv
      val caml_option : 'a option Gobject.data_conv
      val wrap :
        inj:('-> 'b) ->
        proj:('-> 'a) -> 'Gobject.data_conv -> 'Gobject.data_conv
      val of_value : 'Gobject.data_conv -> Gobject.g_value -> 'a
      val to_value : 'Gobject.data_conv -> '-> Gobject.g_value
      val get_type : 'Gobject.data_conv -> Gobject.g_type
    end
  module Property :
    sig
      val freeze_notify : 'Gobject.obj -> unit
      val thaw_notify : 'Gobject.obj -> unit
      val notify : 'Gobject.obj -> string -> unit
      val set_value : 'Gobject.obj -> string -> Gobject.g_value -> unit
      val get_value : 'Gobject.obj -> string -> Gobject.g_value -> unit
      val get_type : 'Gobject.obj -> string -> Gobject.g_type
      val set_dyn : 'Gobject.obj -> string -> 'Gobject.data_set -> unit
      val get_dyn : 'Gobject.obj -> string -> Gobject.data_get
      val set : 'Gobject.obj -> ('a, 'b) Gobject.property -> '-> unit
      val get : 'Gobject.obj -> ('a, 'b) Gobject.property -> 'b
      val get_some : 'Gobject.obj -> ('a, 'b option) Gobject.property -> 'b
      val check : 'Gobject.obj -> ('a, 'b) Gobject.property -> unit
      val may_cons :
        ('a, 'b) Gobject.property ->
        'b option -> 'Gobject.param list -> 'Gobject.param list
      val may_cons_opt :
        ('a, 'b option) Gobject.property ->
        'b option -> 'Gobject.param list -> 'Gobject.param list
    end
end