The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package MooseX::Types::Varchar;
use strict;
use warnings;

use 5.008;
our $VERSION = '0.05';

use MooseX::Types::Parameterizable qw(Parameterizable);
use MooseX::Types -declare => [qw( Varchar TrimmableVarchar )];
use MooseX::Types::Moose qw/ Str Int /;
use namespace::clean;

subtype Varchar,
      as Parameterizable[Str,Int],
      where {
        my($string, $int) = @_;
        $int >= length($string) ? 1:0;
      },
      message {
        my ($val, $constraining) = @_;

        # for 5.8, probably switch to  $foo //= ''; if 5.10 is an option
        $val          ||= defined $val          ? $val          : '';
        $constraining ||= defined $constraining ? $constraining : '';

        qq{Validation failed for 'MooseX::Types::Varchar[$constraining]' with value "$val"};
      };

subtype TrimmableVarchar, as Varchar, where { 1 };
coerce TrimmableVarchar, from Str, via {
    my ($val, $len) = @_;
    substr($val, 0, $len);
};

1;

__END__

=head1 NAME

MooseX::Types::Varchar - Str type parameterizable by length.

=head1 SYNOPSIS

  package MyClass;
  use Moose;
  use MooseX::Types::Varchar qw/ Varchar TrimmableVarchar /;

  has 'attr1' => (is => 'rw', isa => Varchar[40]);
  has 'attr2' => (is => 'rw', isa => TrimmableVarchar[40], coerce => 1);

  package main;
  my $obj = MyClass->new(
    attr1 => 'this must be under 40 chars',
    attr2 => 'this will be trimmed to 40 chars',
  );

=head1 DESCRIPTION

This module provides a type based on Str, where a length restriction
is paramterizable.

=head1 EXPORTS

Nothing by default. You will want to request "Varchar", provided as a
MooseX::Types type.

=head1 SEE ALSO

=over

=item L<MooseX::Types>

=item L<MooseX::Types::Parameterizable>

=back

=head1 AUTHOR

Chris Andrews <chris@nodnol.org>

=head1 COPYRIGHT

This program is Free software, you may redistribute it under the same
terms as Perl itself.

=cut