=pod

=encoding utf-8

=head1 NAME

Type::Tiny::Manual - an overview of Type::Tiny

=head1 SYNOPSIS

L<Type::Tiny> is a small class for writing type constraints, inspired by
L<Moose>'s type constraint API. It has only one non-core dependency (and even
that is simply a module that was previously distributed as part of Type::Tiny
but has since been spun off), and can be used with L<Moose>, L<Mouse> and
L<Moo> (or none of the above).

Type::Tiny is bundled with L<Type::Library> a framework for organizing type
constraints into collections.

Also bundled is L<Types::Standard>, a Moose-inspired library of useful type
constraints.

L<Type::Params> is also provided, to allow very fast checking and coercion
of function and method parameters.

=head1 SEE ALSO

=over

=item *

L<Libraries|Type::Tiny::Manual::Libraries> - how to build a type library with Type::Tiny, Type::Library and Type::Utils

=item *

L<Coercions|Type::Tiny::Manual::Coercions> - adding coercions to type constraints

=item *

L<Using with Moose|Type::Tiny::Manual::UsingWithMoose> - how to use Type::Tiny and Type::Library with Moose

=item *

L<Using with Mouse|Type::Tiny::Manual::UsingWithMouse> - how to use Type::Tiny and Type::Library with Mouse

=item *

L<Using with Moo|Type::Tiny::Manual::UsingWithMoo> - how to use Type::Tiny and Type::Library with Moo

=item *

L<Using with Other OO Frameworks|Type::Tiny::Manual::UsingWithOther> - how to use Type::Tiny and Type::Library with other OO frameworks

=item *

Type::Tiny and friends don't need to be used within an OO framework. See L<FreeMind::Node> for an example that does not.

=item *

L<Processing arguments to subs|Type::Tiny::Manual::Params> - coerce and validate arguments to functions and methods.

=item *

Other modules using Type::Tiny in interesting ways: L<Type::Tie>, L<Test::Mocha>, L<Scalar::Does>, L<Set::Equivalence>...

=item *

L<Optimization|Type::Tiny::Manual::Optimization> - squeeze the most out of your CPU.

=item *

L<Type::Tiny maintenance policies|Type::Tiny::Manual::Policies> - the stability policy.

=back

=head1 DEPENDENCIES

Type::Tiny requires at least Perl 5.6.1, though certain Unicode-related
features (e.g. non-ASCII type constraint names) may work better in newer
versions of Perl.

Type::Tiny requires L<Exporter::Tiny>, a module that was previously
bundled in this distribution, but has since been spun off as a separate
distribution. Don't worry - it's quick and easy to install.

At run-time, Type::Tiny also requires the following modules: L<B>,
L<B::Deparse>, L<Carp>, L<Data::Dumper>, L<Scalar::Util>, L<Text::Balanced>,
L<overload>, L<strict> and L<warnings>. All of these come bundled with
Perl itself. Prior to Perl 5.8, L<Scalar::Util> and L<Text::Balanced>
do not come bundled with Perl and will need installing separately from
the CPAN.

Certain features require additional modules. Tying a variable to a
type constraint (e.g. C<< tie my $count, Int >>) requires L<Type::Tie>;
stack traces on exceptions require L<Devel::StackTrace>. The
L<Reply::Plugin::TypeTiny> plugin for L<Reply> requires L<Reply>
(obviously). L<Devel::LexAlias> may I<slightly> increase the speed
of some of Type::Tiny's compiled coderefs.

L<Type::Tiny::XS> is not required, but if available provides a speed
boost for some type checks. (Setting the environment variable
C<PERL_TYPE_TINY_XS> to false, or setting C<PERL_ONLY> to true will
suppress the use of Type::Tiny::XS, even if it is available.)

The test suite additionally requires L<Test::More>, L<Test::Fatal>
and L<Test::Requires>. Test::More comes bundled with Perl, but if
you are using a version of Perl older than 5.14, you will need to
upgrade to at least Test::More version 0.96. Test::Requires and
Test::Fatal (plus Try::Tiny which Test::Fatal depends on) are bundled
with Type::Tiny in the C<inc> directory, so you do not need to
install them separately.

If using Type::Tiny in conjunction with L<Moo>, then at least Moo
1.000000 is recommended. If using Type::Tiny with L<Moose>, then at
least Moose 2.0000 is recommended. If using Type::Tiny with L<Mouse>,
then at least Mouse 1.00 is recommended. Type::Tiny is mostly
untested against older versions of these packages.

=head1 TYPE::TINY VERSUS X

=head2 Specio 

Type::Tiny is similar in aim to L<Specio>. The major differences are

=over

=item *

Type::Tiny is "tiny" (Specio will eventually have fewer dependencies
than it currently does, but is unlikely to ever have as few as Type::Tiny);

=item *

Specio has a somewhat nicer API (better method names; less duplication),
and its API is likely to improve further. Type::Tiny's aims at complete
compatibility with current versions of Moose and Mouse, so there is a
limit to how much I can deviate from the existing APIs of
(Moose|Mouse)::Meta::TypeConstraint.

=back

=head2 MooseX::Types

Type::Tiny libraries expose a similar interface to L<MooseX::Types> libraries.
In most cases you should be able to rewrite a L<MooseX::Types> library to
use Type::Tiny pretty easily.

=head2 MooX::Types::MooseLike

Type::Tiny is faster and supports coercions.

=head2 Scalar::Does

L<Scalar::Does> is somewhat of a precursor to Type::Tiny, but has now been
rewritten to use Type::Tiny internally.

It gives you a C<< does($value, $type) >> function that is roughly equivalent
to C<< $type->check($value) >> except that C<< $type >> may be one of a list
of pre-defined strings (instead of a Type::Tiny type constraint); or may be
a package name in which case it will be assumed to be a role and checked with
C<< $value->DOES($type) >>.

=head1 BUGS

Please report any bugs to
L<http://rt.cpan.org/Dist/Display.html?Queue=Type-Tiny>.

=head1 SUPPORT

B<< IRC: >> support is available through in the I<< #moops >> channel
on L<irc.perl.org|http://www.irc.perl.org/channels.html>.

=head1 AUTHOR

Toby Inkster E<lt>tobyink@cpan.orgE<gt>.

=head1 COPYRIGHT AND LICENCE

This software is copyright (c) 2013-2014, 2017 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
