chiark / gitweb /
debian/libsod-dev.install: Fix name of manpage.
[sod] / src / class-make-impl.lisp
index bd2407ec6da3ae700c7d8f7101c0393ab8715f36..7263e44f7fce100afe9284d2b4d161a0c2d9799f 100644 (file)
@@ -72,9 +72,13 @@ (defmethod make-sod-slot
                               :name name
                               :type type
                               :location (file-location location)
-                              :pset pset)))
+                              :pset pset))
+         (initarg-name (get-property pset :initarg :id)))
       (with-slots (slots) class
        (setf slots (append slots (list slot))))
+      (when initarg-name
+       (make-sod-slot-initarg-using-slot class initarg-name
+                                         slot pset location))
       slot)))
 
 (defmethod shared-initialize :after ((slot sod-slot) slot-names &key pset)
@@ -92,14 +96,20 @@ (defmethod make-sod-instance-initializer
     ((class sod-class) nick name value pset &optional location)
   (with-default-error-location (location)
     (let* ((slot (find-instance-slot-by-name class nick name))
+          (initarg-name (get-property pset :initarg :id))
           (initializer (and value
                             (make-sod-initializer-using-slot
                              class slot 'sod-instance-initializer
                              value pset (file-location location)))))
       (with-slots (instance-initializers) class
-
-       (setf instance-initializers
-             (append instance-initializers (list initializer))))
+       (unless (or initarg-name initializer)
+         (error "Slot initializer declaration with no effect"))
+       (when initarg-name
+         (make-sod-slot-initarg-using-slot class initarg-name slot
+                                           pset location))
+       (when initializer
+         (setf instance-initializers
+               (append instance-initializers (list initializer)))))
       initializer)))
 
 (defmethod make-sod-class-initializer
@@ -132,6 +142,36 @@ (defmethod shared-initialize :after
   (declare (ignore slot-names pset))
   nil)
 
+(defmethod make-sod-user-initarg
+    ((class sod-class) name type pset &optional default location)
+  (declare (ignore pset))
+  (with-slots (initargs) class
+    (push (make-instance 'sod-user-initarg :location (file-location location)
+                        :class class :name name :type type :default default)
+         initargs)))
+
+(defmethod make-sod-slot-initarg
+    ((class sod-class) name nick slot-name pset &optional location)
+  (let ((slot (find-instance-slot-by-name class nick slot-name)))
+    (make-sod-slot-initarg-using-slot class name slot pset location)))
+
+(defmethod make-sod-slot-initarg-using-slot
+    ((class sod-class) name (slot sod-slot) pset &optional location)
+  (declare (ignore pset))
+  (with-slots (initargs) class
+    (with-slots ((type %type)) slot
+      (push (make-instance 'sod-slot-initarg
+                          :location (file-location location)
+                          :class class :name name :type type :slot slot)
+           initargs))))
+
+(defmethod sod-initarg-default ((initarg sod-initarg)) nil)
+
+(defmethod sod-initarg-argument ((initarg sod-initarg))
+  (make-argument (sod-initarg-name initarg)
+                (sod-initarg-type initarg)
+                (sod-initarg-default initarg)))
+
 ;;;--------------------------------------------------------------------------
 ;;; Initialization and teardown fragments.