package Reporter::Validation; # called as $app->model->validate( => $params ); eg search_form => $params use Moo; has search_form => ( is => 'lazy', builder => sub { Reporter::Validation::SearchForm->new } ); has report_form => ( is => 'lazy', builder => sub { Reporter::Validation::ReportForm->new } ); 1; #=============================================================================== package Reporter::Validation::SearchForm; use HTML::FormHandler::Moose; extends 'HTML::FormHandler'; use Moose::Util::TypeConstraints; has_field lab_number => ( type => 'Text', apply => [ 'LabNumFormat' ], ); subtype 'LabNumFormat' => as 'Str' => where { $_ =~ m!\d+/\d{2}! } => message { 'lab number format incorrect: require nnn/yy' }; no HTML::FormHandler::Moose; 1; #=============================================================================== package Reporter::Validation::ReportForm; use HTML::FormHandler::Moose; extends 'HTML::FormHandler'; use Moose::Util::TypeConstraints; has_field diagnosis_id => ( type => 'Integer', reqired => 1, ); no HTML::FormHandler::Moose; 1;