+;; Initialize the glib type system
+(defbinding type-init () nil)
+(type-init)
+
+(deftype type-number () 'unsigned-long)
+
+(deftype gtype () 'symbol)
+
+(define-type-method alien-type ((type gtype))
+ (declare (ignore type))
+ (alien-type 'type-number))
+
+(define-type-method size-of ((type gtype) &key (inlined t))
+ (assert-inlined type inlined)
+ (size-of 'type-number))
+
+(define-type-method to-alien-form ((type gtype) gtype &optional copy-p)
+ (declare (ignore type copy-p))
+ `(find-type-number ,gtype t))
+
+(define-type-method to-alien-function ((type gtype) &optional copy-p)
+ (declare (ignore type copy-p))
+ #'(lambda (gtype)
+ (find-type-number gtype t)))
+
+(define-type-method from-alien-form ((type gtype) form &key ref)
+ (declare (ignore type ref))
+ `(type-from-number ,form))
+
+(define-type-method from-alien-function ((type gtype) &key ref)
+ (declare (ignore type ref))
+ #'(lambda (type-number)
+ (type-from-number type-number)))
+
+(define-type-method writer-function ((type gtype) &key temp (inlined t))
+ (declare (ignore temp))
+ (assert-inlined type inlined)
+ (let ((writer (writer-function 'type-number)))
+ #'(lambda (gtype location &optional (offset 0))
+ (funcall writer (find-type-number gtype t) location offset))))
+
+(define-type-method reader-function ((type gtype) &key ref (inlined t))
+ (declare (ignore ref))
+ (assert-inlined type inlined)
+ (let ((reader (reader-function 'type-number)))
+ #'(lambda (location &optional (offset 0))
+ (type-from-number (funcall reader location offset)))))