=pod

=head1 NAME

Moose::Cookbook::Snack::Keywords - Restricted keywords in Moose 

=head1 DESCRIPTION

There are several keywords exported by L<Moose> that can cause clashes 
against other user-defined barewords. The following document provides 
a list of those keywords in a single place for easy reference.

=head2 The 'meta' keyword

While most of the reserved keywords collisions can be avoided, however 
I<meta> is the only one you B<can not> override. Do not attempt to override
I<meta>, it will break the Moose internals.

=head2 Moose Keywords 

If you are using L<Moose> or L<Moose::Role> its 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 make_immutable 

=item confess 

=item blessed 

=back

=head2 Moose::Util::TypeConstraints Keywords 

If you are using L<Moose::Util::TypeConstraints> its best to avoid 
these keywords 

=over 4

=item type 

=item subtype 

=item class_type 

=item role_type 

=item as 

=item where 

=item message 

=item optimize_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 keywords L<Moose> exports just add C<no Moose> at the bottom of 
your code, like so:

  package Thing;
  use Moose;

  # code here

  no Moose;

This will un-export the keywords that L<Moose> originally exported. The same 
will also work for L<Moose::Role> and L<Moose::Util::TypeConstraints>. It is 
general L<Moose> policy that this feature is used.

=head3  Sub::Exporter

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::clean

You can also use L<namespace::clean> to clean up your namespace, but you must 
be careful not to remove C<meta> with this. Here is an example of that usage:

  package Foo;
  use Moose;
  use namespace::clean -except => 'meta';
  # ...

=head1 SEE ALSO

=over 4

=item L<Moose>

=item L<Moose::Role>

=item L<Moose::Utils::TypeConstraints>

=item L<Sub::Exporter>

=item L<namespace::clean>

=back

=head1 AUTHOR

John Goulah C<E<lt>jgoulah@cpan.org<gt>>

Stevan Little E<lt>stevan@iinteractive.comE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright 2006-2008 by Infinity Interactive, Inc.

L<http://www.iinteractive.com>

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=cut