Ambrosia

 view release on metacpan or  search on metacpan

lib/Ambrosia/Validator/Constraint.pm  view on Meta::CPAN

package Ambrosia::Validator::Constraint;
use strict;
use warnings;

use Ambrosia::Utils::Util qw(escape_html);

use Ambrosia::Meta;

class sealed
{
    public => [qw/name errorMessage/],
    private => [qw/constraint/],
};

our $VERSION = 0.010;

sub _init
{
    my $self = shift;
    $self->SUPER::_init(@_);

    $self->errorMessage = [];
    $self->constraint = sub() { return (shift(), [], []) };
}

sub check
{
    my $self = shift;
    my $v;
    ($v, $self->errorMessage) = $self->constraint->(@_);
    return $v;
}

sub error
{
    return scalar @{$_[0]->errorMessage};
}

sub Require
{
    my $self = shift;
    my %p = @_;

    unless (exists $p{notUndefined} || exists $p{notEmpty})
    {
        $p{notUndefined} = 1;
    }

    my $notUndefined_em = $p{errorMessage} || $self->name . ' not mast be undefined.';
    my $notEmpty_em = $p{errorMessage} || $self->name . ' not mast be empty.';

    my $prev = $self->constraint;
    $self->constraint = sub {
        my ($v, $pEM) = $prev->(shift);

        if ($p{notUndefined} && not defined $v)
        {
            push @$pEM, $notUndefined_em;
        }
        elsif($p{notEmpty} && !$v)
        {
            push @$pEM, $notEmpty_em;
        }
        return ($v, $pEM);
    };

    return $self;
}

sub Boolean
{
    my $self = shift;
    my %p = @_;

    my $notBoolean_em = $p{errorMessage} || $self->name . ' inposible convert to boolean.';

    my $prev = $self->constraint;
    $self->constraint = sub {
        my ($v, $pEM) = $prev->(shift);



( run in 0.976 second using v1.01-cache-2.11-cpan-ff9377addf4 )