HTML::FormFu::Constraint::AllOrNone - Multi-field All or None Constraint


HTML-FormFu documentation Contained in the HTML-FormFu distribution.

Index


Code Index:

NAME

Top

HTML::FormFu::Constraint::AllOrNone - Multi-field All or None Constraint

SYNOPSIS

Top

    type: AllOrNone
    name: foo
    others: [bar, baz]

DESCRIPTION

Top

Ensure that either all or none of the named fields are present.

By default, if some but not all fields are submitted, errors are attached to those fields which weren't submitted. This behaviour can be changed by setting any of attach_errors_to_base in HTML::FormFu::Constraint::_others, attach_errors_to_others in HTML::FormFu::Constraint::_others or attach_errors_to in HTML::FormFu::Constraint::_others.

This constraint doesn't honour the not() value.

SEE ALSO

Top

Is a sub-class of, and inherits methods from HTML::FormFu::Constraint::_others, HTML::FormFu::Constraint

HTML::FormFu

AUTHOR

Top

Carl Franks cfranks@cpan.org

LICENSE

Top

This library is free software, you can redistribute it and/or modify it under the same terms as Perl itself.


HTML-FormFu documentation Contained in the HTML-FormFu distribution.

package HTML::FormFu::Constraint::AllOrNone;
use Moose;
extends 'HTML::FormFu::Constraint';

with 'HTML::FormFu::Role::Constraint::Others';

sub process {
    my ( $self, $params ) = @_;

    # check when condition
    return if !$self->_process_when($params);

    my $others = $self->others;
    return if !defined $others;

    my @names = ( $self->nested_name );
    push @names, ref $others ? @{$others} : $others;

    my @failed;

    for my $name (@names) {
        my $value = $self->get_nested_hash_value( $params, $name );

        my $seen = 0;
        if ( ref $value eq 'ARRAY' ) {
            my @errors = eval { $self->constrain_values( $value, $params ) };

            if ( !@errors && !$@ ) {
                $seen = 1;
            }
        }
        else {
            my $ok = eval { $self->constrain_value($value) };

            if ( $ok && !$@ ) {
                $seen = 1;
            }
        }

        if ( !$seen ) {
            push @failed, $name;
        }
    }

    my $pass = @failed && scalar @failed != scalar @names ? 0 : 1;

    return $self->mk_errors( {
            pass   => $pass,
            failed => $pass ? [] : \@failed,
            names  => \@names,
        } );
}

sub constrain_value {
    my ( $self, $value ) = @_;

    return 0 if !defined $value || $value eq '';

    return 1;
}

__PACKAGE__->meta->make_immutable;

1;

__END__