# Module Gobject

    module Gobject: sig .. end

    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 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 'a 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 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 obj option
           | `POINTER of Gpointer.boxed option
           | `STRING of string option ]

    type 'a data_conv = {

`` | `kind : `data_kind`;`
`` | `proj : `data_conv_get -> 'a`;`
`` | `inj : `'a -> unit data_set`;`

}

    type ('a, 'b) property = {

`` | `name : `string`;`
`` | `conv : `'b 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 ]

    type signal_type = [ `ACTION | `NO_HOOKS | `NO_RECURSE | `RUN_FIRST | `RUN_LAST ]

    exception Cannot_cast of string * string

    val get_type : 'a obj -> g_type

    val is_a : 'a obj -> string -> bool

    val try_cast : 'a obj -> string -> 'b obj

    val get_oid : 'a obj -> int

    val unsafe_cast : 'a obj -> 'b obj

    val coerce : 'a obj -> unit obj

    val coerce_option : 'a obj option -> unit obj option

    type +'a param

    val dyn_param : string -> 'a data_set -> 'b param

    val param : ('a, 'b) property -> 'b -> 'a param

    val unsafe_create : classe:string -> 'a param list -> 'a obj

    val unsafe_unref : 'a obj -> unit

    val get_ref_count : 'a obj -> int

    val set : ('a, 'b) property -> 'a obj -> 'b -> unit

    val get : ('a, 'b) property -> 'a obj -> 'b

    val set_params : 'a obj -> 'a param list -> unit

    module Type: sig .. end

    module Value: sig .. end

    module Closure: sig .. end

    module Data: sig .. end

    module Property: sig .. end