: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)
;;; Slot initializers.
(defmethod make-sod-instance-initializer
- ((class sod-class) nick name value-kind value-form pset
- &optional location)
+ ((class sod-class) nick name value pset &optional location)
(with-default-error-location (location)
(let* ((slot (find-instance-slot-by-name class nick name))
- (initializer (make-sod-initializer-using-slot
- class slot 'sod-instance-initializer
- value-kind value-form pset
- (file-location location))))
+ (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
- ((class sod-class) nick name value-kind value-form pset
- &optional location)
+ ((class sod-class) nick name value pset &optional location)
(with-default-error-location (location)
(let* ((slot (find-class-slot-by-name class nick name))
(initializer (make-sod-initializer-using-slot
class slot 'sod-class-initializer
- value-kind value-form pset
- (file-location location))))
+ value pset (file-location location))))
(with-slots (class-initializers) class
(setf class-initializers
(append class-initializers (list initializer))))
initializer)))
(defmethod make-sod-initializer-using-slot
- ((class sod-class) (slot sod-slot)
- init-class value-kind value-form pset location)
+ ((class sod-class) (slot sod-slot) init-class value pset location)
(make-instance (get-property pset :initializer-class :symbol init-class)
:class class
:slot slot
- :value-kind value-kind
- :value-form value-form
+ :value value
:location (file-location location)
:pset pset))
(declare (ignore slot-names pset))
nil)
+(defmethod make-sod-user-initarg
+ ((class sod-class) name type pset &optional default location)
+ (with-slots (initargs) class
+ (push (make-instance (get-property pset :initarg-class :symbol
+ '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)
+ (with-slots (initargs) class
+ (with-slots ((type %type)) slot
+ (push (make-instance (get-property pset :initarg-class :symbol
+ '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.
+
+(defmethod make-sod-class-initfrag
+ ((class sod-class) frag pset &optional location)
+ (declare (ignore pset location))
+ (with-slots (initfrags) class
+ (setf initfrags (append initfrags (list frag)))))
+
+(defmethod make-sod-class-tearfrag
+ ((class sod-class) frag pset &optional location)
+ (declare (ignore pset location))
+ (with-slots (tearfrags) class
+ (setf tearfrags (append tearfrags (list frag)))))
+
;;;--------------------------------------------------------------------------
;;; Messages.