A complete sidebar, but something for the people reading this. There are other things that are somewhat app-specific, but have some good points that can be built upon or even just taken if the license permits.
I hate tooting my own horn, but a few people have found it worth stealing for their projects: Mango::Form. It uses a hybrid config of CGI::FormBuilder for the form definitions with FormValidator::Simple config for the validation all in the same config file. The CGI::FB validation wasn't as good as FV::S for me, so the two got married together.
I should also mention, and I think this is an important thing to list on all of the modules above, is support for message/error/label localization, both internally in the modules, or externally via callbacks or something.
In the case of Mango::Form, labels default LABEL_FIELDNAME and error messages default to FIELD_CONSTRAINTNAME. These can be overriden in the config above, but are all mostly passed through L18N like Maketext, or the Catalyst::Plugin::L10N or other such things.
Once people find a good form handler, then a good validator, the next things that usually bites is the localization of grouping of the messages themselves.