The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Mojolicious::Plugin::Vparam::Barcode;
use Mojo::Base -strict;
use Mojolicious::Plugin::Vparam::Common;

sub check_barcode($) {
    return 'Value not defined'      unless defined $_[0];
    return 'Value not set'          unless length  $_[0];
    return 'Wrong format'           unless $_[0] =~ m{^[0-9]+$};

    my $crc = 0;
    my @str = reverse split '', $_[0];
    for my $i ( 0 .. $#str  ) {
        my $digit = $str[$i];
        $digit *= 3 if $i % 2;
        $crc += $digit;
    }
    return 'Checksum error'         if $crc % 10;

    return 0;
}

sub parse_barcode($) {
    my ($str) = @_;
    return undef unless defined $str;
    s{[^0-9]}{}g for $str;
    return $str;
}

sub register {
    my ($class, $self, $app, $conf) = @_;

    $app->vtype(
        barcode     =>
            pre     => sub { parse_barcode      $_[1] },
            valid   => sub { check_barcode      $_[1] },
    );

    return;
}

1;