Type::Tiny::Manual::UsingWithMoose(3) how to use Type::Tiny and Type::Library with Moose

SYNOPSIS


{
package Person;

use Moose;
use Types::Standard qw( Str Int );
use Type::Utils qw( declare as where inline_as coerce from );

has name => (
is => "ro",
isa => Str,
);

my $PositiveInt = declare
as Int,
where { $_ > 0 },
inline_as { "$_ =~ /^[0-9]+\$/ and $_ > 0" };

coerce $PositiveInt, from Int, q{ abs $_ };

has age => (
is => "ro",
isa => $PositiveInt,
coerce => 1,
writer => "_set_age",
);

sub get_older {
my $self = shift;
my ($years) = @_;
$PositiveInt->assert_valid($years);
$self->_set_age($self->age + $years);
}
}

DESCRIPTION

Type::Tiny type constraints have an API almost identical to that of Moose::Meta::TypeConstraint. It is also able to build a Moose::Meta::TypeConstraint constraint from a Type::Tiny constraint, and will do so automatically when needed. When Moose.pm is loaded, Type::Tiny will use Perl's "AUTOLOAD" feature to proxy method calls through to the Moose::Meta::TypeConstraint object. In short, you can use a Type::Tiny object pretty much anywhere you'd use a Moose::Meta::TypeConstraint and you are unlikely to notice the difference.

Per-Attribute Coercions

Type::Tiny offers convenience methods to alter the list of coercions associated with a type constraint. Let's imagine we wish to allow our "name" attribute to be coerced from an arrayref of strings.

      has name => (
         is      => "ro",
         isa     => Str->plus_coercions(
            ArrayRef[Str], sub { join " ", @{$_} },
         ),
         coerce  => 1,
      );

This coercion will apply to the "name" attribute only; other attributes using the "Str" type constraint will be unaffected.

See the documentation for "plus_coercions", "minus_coercions" and "no_coercions" in Type::Tiny.

Optimization

The usual advice for optimizing type constraints applies: use type constraints which can be inlined whenever possible.

Defining coercions as strings rather than coderefs won't give you as much of a boost with Moose as it does with Moo, because Moose doesn't inline coercion code. However, it should still improve performance somewhat because it allows Type::Coercion to do some internal inlining.

See also Type::Tiny::Manual::Optimization.

Interactions with MooseX-Types

Type::Tiny and MooseX::Types type constraints should ``play nice''. If, for example, "ArrayRef" is taken from Types::Standard (i.e. a Type::Tiny-based type library), and "PositiveInt" is taken from MooseX::Types::Common::Numeric, then the following should ``just work'':

   isa => ArrayRef[ PositiveInt ]
   isa => PositiveInt | ArrayRef

AUTHOR

Toby Inkster <[email protected]>.

COPYRIGHT AND LICENCE

This software is copyright (c) 2013-2014 by Toby Inkster.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

DISCLAIMER OF WARRANTIES

THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.