(:method (message combination type)
t))
+(defgeneric aggregating-message-method-return-type (message combination)
+ (:documentation
+ "Return the primary method return type for this MESSAGE and COMBINATION.")
+ (:method ((message aggregating-message) (combination t))
+ (c-type-subtype (sod-message-type message))))
+
(export 'aggregating-effective-method)
(defclass aggregating-effective-method (simple-effective-method) ()
(:documentation "Effective method counterpart to `aggregating-message'."))
arg-names
plist)))))))
+(defmethod check-method-type
+ ((method sod-method) (message aggregating-message)
+ (type c-function-type))
+ (let ((wanted (aggregating-message-method-return-type
+ message (sod-message-combination message)))
+ (msgtype (sod-message-type message)))
+ (unless (c-type-equal-p (c-type-subtype type) wanted)
+ (error "Method return type ~A doesn't match message ~A"
+ (c-type-subtype msgtype) (c-type-subtype type)))
+ (unless (argument-lists-compatible-p (c-function-arguments msgtype)
+ (c-function-arguments type))
+ (error "Method arguments ~A don't match message ~A" type msgtype))))
+
;;;--------------------------------------------------------------------------
;;; Utilities.