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

my $RESERVED_ID = {
    'root' => 1,
    'admin' => 1,
};

sub gen_form {
    my $q = shift;
    HTML::Shakan->new(
        request => $q,
        fields => [
            TextField(
                name => 'id',
                custom_validation => sub {
                    my ($form, $field) = @_;
                    if ($RESERVED_ID->{$form->param($field->name)}) {
                        $form->set_error($field->name() => 'reserved');
                    }
                },
            ),
        ],
    );
}

{
    my $f1 = gen_form(
        CGI->new({
            id => 'foo',
        })
    );
    ok $f1->is_valid(), 'valid';
}

{
    my $f2 = gen_form(
        CGI->new({
            id => 'admin',
        })
    );
    ok ! $f2->is_valid(), 'invalid';
}