NAME
MooseX::Types::MoreUtils - utility methods to apply to Moose type
constraints
SYNOPSIS
{
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,
);
}
DESCRIPTION
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.
Methods
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".
Constraint manipulation
$_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`.
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.
Coercion manipulation
$_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:
# 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 { ... }
);
Shortcuts for type constraints
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`.
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.
CAVEATS
This module does not remove the need for `coerce => 1`!
BUGS
Please report any bugs to
<http://rt.cpan.org/Dist/Display.html?Queue=MooseX-Types-MoreUtils>.
SEE ALSO
If you use Types::Standard, this module is fairly redundant, as these
features and shortcuts are mostly built-in!
AUTHOR
Toby Inkster <tobyink@cpan.org>.
COPYRIGHT AND LICENCE
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.
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.