+Practically speaking, creating GObject class requires defining CLOS class that correspond to GObject class and calling @code{register-object-type-implementation} with information about the class (its GType name, superclass, interfaces and properties).
+
+Interface that is implemented by a class should have its vtable defined by @code{define-vtable}. Vtable definitions consists of a list of functions's names and signatures and their locations in vtable.
+
+Unfortunately, GObject does not provide information about vtables, and does not support using GClosures to implement virtual functions. Therefore, implementation for all interface's functions are defined as CFFI foreign callbacks. These callbacks in turn call corresponding generic functions that should be specialized on required objects.
+
+@node define-vtable
+@section define-vtable
+
+@lisp
+(define-vtable (type-name cstruct-name)
+ &body item*)
+
+item ::= (name callback-name return-type &rest arg*)
+item ::= (:skip cffi-structure-item)
+arg ::= (arg-name arg-type)
+@end lisp
+
+@table @var
+@item @var{type-name}
+A string naming the GObject type of interface
+@item @var{cstruct-name}
+A name for a generated CFFI foreign structure
+@item @var{name}
+A name for implementation generic function
+@item @var{callback-name}
+A name for generated callback function
+@item @var{return-type}
+A CFFI specifier for foreign function return type
+@item @var{arg-name}
+A symbol naming the argument of interface method
+@item @var{arg-type}
+A CFFI specifier for foreign function argument type
+@end table
+
+Macro that specifies the vtable for an interface. This macro defines generic functions (named by @code{name}) that correspond to methods of an interface. On these generic functions methods should be defined that implement the interface method. @code{item}s specify the CFFI foreign structure for vtable. Vtable contains not only function pointers, but other slots. Such slots should be specified here with @code{:skip} prepended to them. This is needed to be able to correctly calculate offsets to function pointers in vtable.
+
+Example:
+@lisp
+(define-vtable ("GtkTreeModel" c-gtk-tree-model)
+ (:skip parent-instance g-type-interface)
+ ;;some signals
+ (:skip tree-model-row-changed :pointer)
+ (:skip tree-model-row-inserted :pointer)
+ (:skip tree-model-row-has-child-toggled :pointer)
+ (:skip tree-model-row-deleted :pointer)
+ (:skip tree-model-rows-reordered :pointer)
+ ;;methods
+ (tree-model-get-flags-impl tree-model-get-flags-cb
+ tree-model-flags
+ (tree-model g-object))
+ (tree-model-get-n-columns-impl tree-model-get-n-columns-cb
+ :int
+ (tree-model g-object))
+ (tree-model-get-column-type-impl tree-model-get-column-type-cb
+ g-type-designator
+ (tree-model g-object) (index :int))
+ (tree-model-get-iter-impl tree-model-get-iter-cb
+ :boolean
+ (tree-model g-object) (iter (g-boxed-foreign tree-iter)) (path (g-boxed-foreign tree-path)))
+ (tree-model-get-path-impl tree-model-get-path-cb
+ (g-boxed-foreign tree-path :return)
+ (tree-model g-object) (iter (g-boxed-foreign tree-iter)))
+ (tree-model-get-value-impl tree-model-get-value-cb
+ :void
+ (tree-model g-object) (iter (g-boxed-foreign tree-iter)) (n :int) (value (:pointer g-value)))
+ (tree-model-iter-next-impl tree-model-iter-next-cb
+ :boolean
+ (tree-model g-object) (iter (g-boxed-foreign tree-iter)))
+ (tree-model-iter-children-impl tree-model-iter-children-cb
+ :boolean
+ (tree-model g-object) (iter (g-boxed-foreign tree-iter)) (parent (g-boxed-foreign tree-iter)))
+ (tree-model-iter-has-child-impl tree-model-iter-has-child-cb
+ :boolean
+ (tree-model g-object) (iter (g-boxed-foreign tree-iter)))
+ (tree-model-iter-n-children-impl tree-model-iter-n-children-cb
+ :int
+ (tree-model g-object) (iter (g-boxed-foreign tree-iter)))
+ (tree-model-iter-nth-child-impl tree-model-iter-nth-child-cb
+ :boolean
+ (tree-model g-object) (iter (g-boxed-foreign tree-iter)) (parent (g-boxed-foreign tree-iter)) (n :int))
+ (tree-model-iter-parent-impl tree-model-iter-parent-cb
+ :boolean
+ (tree-model g-object) (iter (g-boxed-foreign tree-iter)) (child (g-boxed-foreign tree-iter)))
+ (tree-model-ref-node-impl tree-model-ref-node-cb
+ :void
+ (tree-model g-object) (iter (g-boxed-foreign tree-iter)))
+ (tree-model-unref-node-impl tree-model-unref-node-cb
+ :void
+ (tree-model g-object) (iter (g-boxed-foreign tree-iter))))
+@end lisp
+
+@node register-object-type-implementation
+@section register-object-type-implementation
+
+@lisp
+(register-object-type-implementation name class parent interfaces properties)
+@end lisp
+
+@table @var
+@item @var{name}
+A string naming the new GObject class.
+@item @var{class}
+A class name of corresponding CLOS class. It should be inherited from @code{g-object} or its descendants.
+@item @var{parent}
+A string naming the GObject superclass
+@item @var{interfaces}
+A list of names of interfaces that this class implements.
+@item @var{properties}
+A list of properties that this class provides.
+Each property is defined as
+@lisp
+property ::= (property-name property-type accessor property-get-fn property-set-fn)
+@end lisp
+@end table
+
+A macro that creates a new GObject type and registers the Lisp implementation for it.
+
+Example:
+@lisp
+(register-object-type-implementation "LispArrayListStore" array-list-store "GObject" ("GtkTreeModel") nil)
+@end lisp