The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 9;

# begin
package MyVal;

use Validation::Class;

mixin 'trim' => {filters => [qw/trim strip/]};

field 'dist' => {
    mixin      => 'trim',
    label      => 'distribution',
    error      => 'invalid distribution description',
    filters    => sub { $_[0] =~ s/::/-/g; $_[0] },
    pattern    => qr/[a-zA-Z0-9\-:]+(\-[0-9\.\_\-]+)?/,
    max_length => 150
};

field 'login',
  { label     => 'user login',
    error     => 'login invalid',
    filtering => 'post',
    filters   => [qw/trim strip alphanumeric/]
  };

field 'password', {
    label => 'user password',
    error => 'password invalid',

    # no filtering at all
};

field 'name',
  { label     => 'user name',
    error     => 'invalid name',
    filtering => 'pre',
    filters   => [qw/trim strip alpha titlecase/]
  };

package main;

my $rules = MyVal->new(
    params => {
        name     => 'george 3',
        login    => 'admin@abco.com',
        password => '#!/bin/bash',
        dist     => ' Validation::Class    '
    }
);

ok $rules, 'validation class init ok';
ok $rules->params->{name}     =~ /^George$/,           'name as expected';
ok $rules->params->{login}    =~ /^admin\@abco\.com$/, 'login as expected';
ok $rules->params->{password} =~ /^#!\/bin\/bash$/,    'password as expected';

ok $rules->validate, 'validation failed ok';

ok $rules->params->{name}     =~ /^George$/,        'name as expected';
ok $rules->params->{login}    =~ /^adminabcocom$/,  'login as expected';
ok $rules->params->{password} =~ /^#!\/bin\/bash$/, 'password as expected';

ok $rules->params->{dist} =~ /^Validation-Class$/, 'dist as expected';