# PODNAME: Moose::Cookbook::Snack::Keywords
# ABSTRACT: Restricted "keywords" in Moose
__END__
=pod
=encoding UTF-8
=head1 NAME
Moose::Cookbook::Snack::Keywords - Restricted "keywords" in Moose
=head1 VERSION
version 2.2201
=head1 DESCRIPTION
Moose exports a number of sugar functions in order to emulate Perl
built-in keywords. These can cause clashes with other user-defined
functions. This document provides a list of those keywords for easy
reference.
=head2 The 'meta' keyword
C<S<use Moose>> adds a method called C<meta> to your class. If this
conflicts with a method or function you are using, you can rename it,
or prevent it from being installed entirely. To do this, pass the
C<-meta_name> option when you C<S<use Moose>>. For instance:
# install it under a different name
use Moose -meta_name => 'moose_meta';
# don't install it at all
use Moose -meta_name => undef;
=head2 Moose Keywords
If you are using L<Moose> or L<Moose::Role> it is best to avoid these
keywords:
=over 4
=item extends
=item with
=item has
=item before
=item after
=item around
=item super
=item override
=item inner
=item augment
=item confess
=item blessed
=item meta
=back
=head2 Moose::Util::TypeConstraints Keywords
If you are using L<Moose::Util::TypeConstraints> it is best to avoid
these keywords:
=over 4
=item type
=item subtype
=item class_type
=item role_type
=item maybe_type
=item duck_type
=item as
=item where
=item message
=item inline_as
=item coerce
=item from
=item via
=item enum
=item find_type_constraint
=item register_type_constraint
=back
=head2 Avoiding collisions
=head3 Turning off Moose
To remove the sugar functions L<Moose> exports, just add C<S<no Moose>>
at the bottom of your code:
package Thing;
use Moose;
# code here
no Moose;
This will unexport the sugar functions that L<Moose> originally
exported. The same will also work for L<Moose::Role> and
L<Moose::Util::TypeConstraints>.
=head3 Sub::Exporter features
L<Moose>, L<Moose::Role> and L<Moose::Util::TypeConstraints> all use
L<Sub::Exporter> to handle all their exporting needs. This means that
all the features that L<Sub::Exporter> provides are also available to
them.
For instance, with L<Sub::Exporter> you can rename keywords, like so:
package LOL::Cat;
use Moose 'has' => { -as => 'i_can_haz' };
i_can_haz 'cheeseburger' => (
is => 'rw',
trigger => sub { print "NOM NOM" }
);
LOL::Cat->new->cheeseburger('KTHNXBYE');
See the L<Sub::Exporter> docs for more information.
=head3 namespace::autoclean and namespace::clean
You can also use L<namespace::autoclean> to clean up your namespace.
This will remove all imported functions from your namespace. Note
that if you are importing functions that are intended to be used as
methods (this includes L<overload>, due to internal implementation
details), it will remove these as well.
Another option is to use L<namespace::clean> directly, but
you must be careful not to remove C<meta> when doing so:
package Foo;
use Moose;
use namespace::clean -except => 'meta';
# ...
=head1 SEE ALSO
=over 4
=item L<Moose>
=item L<Moose::Role>
=item L<Moose::Util::TypeConstraints>
=item L<Sub::Exporter>
=item L<namespace::autoclean>
=item L<namespace::clean>
=back
=head1 AUTHORS
=over 4
=item *
Stevan Little <stevan@cpan.org>
=item *
Dave Rolsky <autarch@urth.org>
=item *
Jesse Luehrs <doy@cpan.org>
=item *
Shawn M Moore <sartak@cpan.org>
=item *
יובל קוג'מן (Yuval Kogman) <nothingmuch@woobling.org>
=item *
Karen Etheridge <ether@cpan.org>
=item *
Florian Ragwitz <rafl@debian.org>
=item *
Hans Dieter Pearcey <hdp@cpan.org>
=item *
Chris Prather <chris@prather.org>
=item *
Matt S Trout <mstrout@cpan.org>
=back
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2006 by Infinity Interactive, Inc.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut