The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package  FormValidator::Lite::Constraint::Time;
use strict;
use warnings;
use FormValidator::Lite::Constraint;

rule 'TIME' => sub {
    if ( ref $_) {
        # query: h=12&m=00&d=60
        # rule:  {time => [qw/h m s/]} => ['TIME']
        _v(@{$_});
    } else {
        # query: time=12:00:30
        # rule:  time => ['time']
        _v(split /:/, $_);
    }
};

sub _v {
    my ($h, $m, $s) = @_;

    return 0 if (!defined($h) or !defined($m));
    return 0 if ("$h" eq "" or "$m" eq "");
    $s ||= 0; # optional

    if ( $h > 23 or $h < 0 or $m > 59 or $m < 0 or $s > 59 or $s < 0 ) {
        return 0;
    }

    return 1;
}

1;
__END__

=head1 NAME

FormValidator::Lite::Constraint::Time - time constraints

=head1 DESCRIPTION

This module provides time constraints.

=head1 CONSTRAINTS

=over 4

=item TIME

    $validator = FormValidator::Lite->new(CGI->new("time=12:29:30"));
    $validator->check(
        time => ['TIME']
    );
    # or
    $validator = FormValidator::Lite->new(CGI->new("h=12&m=29&s=30"));
    $validator->check(
        {time => [qw/h m s/]} => ['TIME']
    );

This constraints checks the parameter is valid time or not.

=back