FV::Liteでvalidメソッドとinvalidメソッドを書いてみると

 多分こうなる

sub valid {
    my ( $self, $key ) = @_;
    return !$self->has_error unless $key;
    return $self->{_error}->{$key} ? '' : $self->{_q}->param($key);
}

sub invalid {
    my ( $self, $key, $rule ) = @_;
    return $self->has_error unless $key;
    my $vkey = $self->{_error}->{$key};
    return 0 unless $vkey;
    return keys(%$vkey) unless $rule;
    return !$vkey->{$rule};
}