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 . SEE ALSO If you use Types::Standard, this module is fairly redundant, as these features and shortcuts are mostly built-in! AUTHOR Toby Inkster . 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.