+ (make-symbol (format nil "~A-SUPPLIED-P" (symbol-name name))))
+
+(defstruct property name accessor-name readable writable)
+
+(defstruct (gobject-property (:include property)) gname type)
+
+(defstruct (cffi-property (:include property)) type reader writer)
+
+(defmethod make-load-form ((object gobject-property) &optional env)
+ (declare (ignore env))
+ `(make-gobject-property :name ',(property-name object)
+ :accessor-name ',(property-accessor-name object)
+ :readable ',(property-readable object)
+ :writable ',(property-writable object)
+ :gname ',(gobject-property-gname object)
+ :type ',(gobject-property-type object)))
+
+(defmethod make-load-form ((object cffi-property) &optional env)
+ (declare (ignore env))
+ `(make-cffi-property :name ',(property-name object)
+ :accessor-name ',(property-accessor-name object)
+ :readable ',(property-readable object)
+ :writable ',(property-writable object)
+ :type ',(cffi-property-type object)
+ :reader ',(cffi-property-reader object)
+ :writer ',(cffi-property-writer object)))
+
+(defun parse-gobject-property (spec)
+ (destructuring-bind (name accessor-name gname type readable writable) spec
+ (make-gobject-property :name name
+ :accessor-name accessor-name
+ :gname gname
+ :type type
+ :readable readable
+ :writable writable)))
+
+(defun parse-cffi-property (spec)
+ (destructuring-bind (name accessor-name type reader writer) spec
+ (make-cffi-property :name name
+ :accessor-name accessor-name
+ :type type
+ :reader reader
+ :writer writer
+ :readable (not (null reader))
+ :writable (not (null writer)))))
+
+(defun parse-property (spec)
+ (cond
+ ((eq (first spec) :cffi) (parse-cffi-property (rest spec)))
+ (t (parse-gobject-property spec))))