The old HTML-Widget process() simply ran all constraints, then all filters, and that was your lot.
FormFu currently goes a step further with: * constraints * filters * inflators I propose making it a lot more powerful and flexible, with the following steps: * filter * constrain * inflate * validate * transform Any of these steps (except 'filter') will be able to throw an exception, which will be displayed to the user as a field error. Each step will only proceed if there are no errors from previous steps. The first filter for each field will be fed the raw input for that field only, and it's output will be piped to the next filter for that field. Likewise, with 'inflate', the output is piped from one inflate handler to the next. The same goes for 'transform', but the first transform handler will receive the inflated value. The purpose of the filter handlers would be to cleanup input before validation, so you might strip leading and trailing whitespace with the 'TrimEdges' filter. Or you might use the 'NonNumeric' filter to remove any spaces or hyphens entered into a credit card number field. The purpose of the 'constrain' handlers would be to check such low-level things such as "is this in range?", "does this contain valid characters?" or "is this an email address?". The purpose of the 'inflate' handlers would be to, for example, turn a date into a DateTime object, or turn a file upload into an Imager object. The purpose of the 'validate' handlers would be to check higher-level (business) rules, and they will have access to the inflated values of all fields. So you could check, for example, "is this date after that date?" or "is 'c' only filled in if 'a' and 'b' are?". Because these are likely to contain more-complex logic, it would be expected that the user would create a new subclass of HTML::Widget::Validate for each business rule, which would contain the programmatic logic. So in your form setup, you only need refer to the validation handler by name (otherwise, you'd end up trying to program in yaml - nasty!). And, of course, if you're using Catalyst::Controller::HTML::FormFu, your validation code will have access to the catalyst context via the form's stash. $self->form->stash->{context} The 'transform' handler is provided as a further hook to do anything else necessary after all validation is complete. You might notice each of these steps are a verb name. This would allow me to get rid of the 'plural' aliases filter/filters, constraint/contraints, which I don't like for some reason ;) So, to take the example of John Napiorkowski's HTML-Widget filters which use Imager to resize uploaded image files to a standard size... I would suggest there should be a HTML::FormFu::Inflate::Imager which simply reads an uploaded file and returns an Imager object. There would then be a HTML::FormFu::Transform::Imager which allows you to call methods on that Imager object. The yaml config for a field might be something like: --- element: - type: file name: avatar inflate: - Imager transform: - type: Imager scaleX: [pixels, 100] Any ideas / criticisms? Cheers, Carl _______________________________________________ Html-widget mailing list Html-widget@lists.rawmode.org http://lists.rawmode.org/cgi-bin/mailman/listinfo/html-widget