The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Data::Transpose::Validator::Subrefs;
use strict;
use warnings;

use base 'Data::Transpose::Validator::Base';

=head1 NAME

Data::Transpose::Validator::Subrefs Validator using custom subroutines

  sub custom_sub {
      my $field = shift;
      return $field
        if $field =~ m/\w/;
      return (undef, "Not a \\w");
  }
  
  my $vcr = Data::Transpose::Validator::Subrefs->new( \&custom_sub );
  
  ok($vcr->is_valid("H!"), "Hi! is valid");
  ok(!$vcr->is_valid("!"), "! is not");
  is($vcr->error, "Not a \\w", "error displayed correctly");
  

=cut

=head2 new(\&subroutine)

The constructor accepts only one argument, a reference to a
subroutine. The class will provide the variable to validate as the
first and only argument. The subroutine is expected to return the
variable itself on success, or a false value.

To set a custom error, the subroutine in case of error should return 2
elements, where the first should be undefined (see the example above).


=cut

sub new {
    my $class = shift;
    my $new = shift;
    die "You have to pass a subref to this class!\n"
      unless (ref($new) eq 'CODE');
    my $self = {
                call => $new,
               };
    bless $self, $class;
}

=head2 call

Accessor to the subroutine

=cut

sub call {
    return shift->{call};
}

=head2 is_valid($what)

The call to the validator.

=cut


sub is_valid {
    my ($self, $arg) = @_;
    $self->reset_errors;
    my ($result, $error) = $self->call->($arg);
    if ($error) {
        $self->error($error);
        return undef;
    } else {
        return $result;
    }
}


1; # the last famous words