[Override validp on standard-component and date-field clinton@unknownlamer.org**20080115222042 I think my protocol is better. A shared default-validp provides a default implementation based around the generic form-fields-of. ] hunk ./src/web.lisp 47 + +(defgeneric form-fields-of (component)) + +(defmethod form-fields-of ((form file-upload-form)) + (mapcar #'cdr (form-fields form))) + +(defmethod form-fields-of ((component standard-component)) + "Return slot values of COMPONENT which are FORM-FIELDs" + (remove-if-not #'ucw::form-field-p + (mapcar (arnesi:curry #'slot-value component) + (remove-if-not #'(lambda (name) (slot-boundp component name)) + (mapcar #'mopp:slot-definition-name + (mopp:class-slots (class-of component))))))) + +(defmethod form-fields-of ((field form-field)) + (list field)) + +(defmethod form-fields-of ((field date-field)) + (list (ucw::year field) (ucw::month field) (ucw::day field))) + +(defun default-validp (form) + (flet ((do-validate-field (field) + "Run validators on FIELD, return list of (FIELD . VALIDATOR) conses." + (multiple-value-bind (validp failed) (validp field) + (declare (ignore validp)) + (mapcar #'(lambda (failed) (cons field failed)) + failed)))) + (let ((failed (apply #'nconc + (mapcar #'do-validate-field + (form-fields-of form))))) + (values (null failed) failed)))) + +(defmethod validp ((form standard-component)) + ;; Mostly yanked from ucw update (C) notices + (default-validp form)) + +(defmethod validp ((form-field date-field)) + (default-validp form-field)) +