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.