MooseX::Types::MoreUtils - utility methods to apply to Moose type constraints
{ package Spruce; use Moose; use MooseX::Types::Moose qw(ArrayRef Str); use MooseX::Types::MoreUtils; use Local::TextUtils qw( csv_to_arrayref ); has goose => ( is => 'ro', isa => ArrayRef->$_plus_coercions( Str, \&csv_to_arrayref ), coerce => 1, ); }
This module provides a bunch of methods for working with Moose type constraints, which it exposes as lexical coderef variables. (Like Object::Util.)
See "Rationale" in Object::Util.
The invocants for these methods are type constraints. These may be Moose::Meta::TypeConstraint, MooseX::Types::TypeDecorator, or Type::Tiny objects. As a convenience, strings are also accepted, which will be looked up via Moose's find_or_create_type_constraint utility function. Various other conveniences are provided; see "Shortcuts for type constraints".
find_or_create_type_constraint
$_where
Creates an anonymous subtype with an additional constraint. For example to create a type constraint that accepts odd-numbered integers, you could use:
isa => Int->$_where(sub { $_ % 2 })
Alternatively the coderef can be replaced with a string of Perl code:
isa => Int->$_where('$_ % 2')
$_of
Can be used to parameterize type constraints. For example, for an arrayref of odd integers:
isa => ArrayRef->$_of( Int->$_where('$_ % 2') )
Or if you'd prefer, an arrayref of integers, where the arrayref contains an odd number of items:
isa => ArrayRef->$_of(Int)->$_where('@$_ % 2')
$_type
The identity function. Int->$_type just returns Int.
Int->$_type
Int
This is occasionally useful if you're taking advantage of the fact that the invocant doesn't have to be a real type constraint but can instead use a shortcut. In these cases it's not quite the identity, because it returns a real type constraint object.
$_plus_coercions
Given an existing type constraint, creates a new child type with some extra coercions.
isa => ArrayRef->$_plus_coercions( Str, \&csv_to_arrayref, "HashRef", sub { [ values(%$_) ] }, ), coerce => 1,
$_minus_coercions
Given an existing type constraint, creates a new child type with fewer coercions.
use MooseX::Types::Moose qw( HashRef ); use MooseX::Types::URI qw( Uri ); # Don't want to coerce from HashRef, # but keep the coercion from Str. # isa => Uri->$_minus_coercions(HashRef)
$_no_coercions
Given an existing type constraint, creates a new child type with no coercions at all.
isa => Uri->$_no_coercions
As above, it's just equivalent to coerce => 0 so might seem a bit useless. But it is handy when chained with $_plus_coercions to provide a stable base to build your coercions on:
coerce => 0
# This doesn't just create a type like Uri but # with extra coercions; it explicitly ignores any # coercions that were already attached to Uri. # isa => Uri->$_no_coercions->$_plus_coercions( Str, sub { ... } );
Where type constraints are expected by this module, you can take some shortcuts. Strings are passed to find_or_create_type_constraint for example, meaning that the following two exampes are identical:
With MooseX::Types...
use MooseX::Types::Moose qw( ArrayRef Str ); ArrayRef->$_plus_coercions( Str, \&csv_to_arrayref );
Without MooseX::Types...
"ArrayRef"->$_plus_coercions( "Str", \&csv_to_arrayref );
If, instead of a type constraint you give a coderef, this will be converted into a subtype of Any.
Any
You may also give a hashref with a single key-value pair, such as:
{ class => "Some::Class::Name" } { role => "Some::Role::Name" } { duck => \@method_names } { union => \@type_constraints } { enum => \@strings }
These do what I think you'd expect them to do.
This module does not remove the need for coerce => 1!
coerce => 1
Please report any bugs to http://rt.cpan.org/Dist/Display.html?Queue=MooseX-Types-MoreUtils.
If you use Types::Standard, this module is fairly redundant, as these features and shortcuts are mostly built-in!
Toby Inkster <tobyink@cpan.org>.
This software is copyright (c) 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.
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.
To install MooseX::Types::MoreUtils, copy and paste the appropriate command in to your terminal.
cpanm
cpanm MooseX::Types::MoreUtils
CPAN shell
perl -MCPAN -e shell install MooseX::Types::MoreUtils
For more information on module installation, please visit the detailed CPAN module installation guide.