package LIMS::Local::MooseX::Role::Validate; use warnings; use strict; use Moose::Role; use Data::Dump; sub DEBUG { warn shift if $ENV{VALIDATION_DEBUG} } sub validate { my ( $class, $data ) = @_; my $meta = $class->meta; my %errors; foreach my $attr ( $meta->compute_all_applicable_attributes ) { my $attr_name = $attr->name; if ( exists $data->{$attr_name} ) { my $value = $data->{$attr_name}; # don't attempt to set empty values on non-required fields unless ( defined($value) && length($value) || $attr->is_required ) { delete $data->{$attr_name}; next; } if ( my $tc = $attr->type_constraint ) { $data->{$attr_name} = $value = $tc->coercion->coerce($value) if ( $tc->has_coercion ); if ( defined( my $error = $tc->validate($value) ) ) { $errors{$attr_name} = $tc->name; next; } } } else { $errors{$attr_name} = 'required' if $attr->is_required; } } DEBUG('errors: ' . Data::Dump::dump(\%errors)); return %errors; } 1;