You might also try Getargs::Long. Autarch, creator of Params::Validate mentions this as a module that does something similar, but with a different interface, in the "see also" section of the documentation for Params::Validate. Haven't used either yet, but I want to start doing this as well, and would be interested in hearing which of these two modules the monks prefer. My impression is that P::V seems to have more of a following.
in reply to Predefining sub Parameters
Autarch discusses the lay of the "data validation" land in Why reinvent the wheel?, in the Data Validation Tests thread. He also mentions Class::ParamParser and Class::ParmList there, maybe these are worth having a look at as well for when you're doing things object oriented.