=pod
=encoding utf-8
=head1 NAME
Type::Tiny::Manual::UsingWithMoose - how to use Type::Tiny and Type::Library with Moose
=head1 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);
}
}
=head1 DESCRIPTION
L<Type::Tiny> type constraints have an API almost identical to that of
L<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 C<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.
=head2 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
C<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 C<name> attribute only; other attributes
using the C<Str> type constraint will be unaffected.
See the documentation for C<plus_coercions>, C<minus_coercions> and
C<no_coercions> in L<Type::Tiny>.
=head2 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
L<Type::Coercion> to do some internal inlining.
=head1 SEE ALSO
For examples using Type::Tiny with L<Moose> see the SYNOPSIS sections of
L<Type::Tiny> and L<Type::Library>, and the files C<< moose.t >>,
C<< moose-coercion.t >> and C<< moo-inflation.t >> in the Type-Tiny
L<test suite|https://bitbucket.org/tobyink/p5-type-tiny/src/tip/t>.
=head1 AUTHOR
Toby Inkster E<lt>tobyink@cpan.orgE<gt>.
=head1 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.
=head1 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.
=cut