Moose::Cookbook::Meta::Recipe1(3pm)
NAME
Moose::Cookbook::Meta::Recipe1 - Welcome to the meta world (Why Go
Meta?)
SUMMARY
You might want to read Moose::Manual::MOP if you haven't done so yet.
If you've ever thought "Moose is great, but I wish it did X
differently", then you've gone meta. The meta recipes demonstrate how
to change and extend the way Moose works by extending and overriding
how the meta classes (Moose::Meta::Class, Moose::Meta::Attribute, etc)
work.
The metaclass API is a set of classes that describe classes, roles,
attributes, etc. The metaclass API lets you ask questions about a
class, like "what attributes does it have?", or "what roles does the
class do?"
The metaclass system also lets you make changes to a class, for example
by adding new methods or attributes.
The interface presented by Moose.pm ("has", "with", "extends") is just
a thin layer of syntactic sugar over the underlying metaclass system.
- By extending and changing how this metaclass system works, you can
create your own Moose variant. - Examples
- Let's say that you want to add additional properties to attributes.
Specifically, we want to add a "label" property to each attribute, so
we can write "My::Class->meta()->get_attribute('size')->label()". The
first two recipes show two different ways to do this, one with a full
meta-attribute subclass, and the other with an attribute trait. - You might also want to add additional properties to your metaclass. For example, if you were writing an ORM based on Moose, you could associate a table name with each class via the class's metaclass object, letting you write "My::Class->meta()->table_name()".
SEE ALSO
Many of the MooseX modules on CPAN implement metaclass extensions. A
couple good examples include MooseX::Singleton and
MooseX::AttributeHelpers. For a more complex example see Fey::ORM or
Reaction.
AUTHOR
Dave Rolsky <autarch@urth.org<gt>
COPYRIGHT AND LICENSE
Copyright 2009 by Infinity Interactive, Inc.
<http://www.iinteractive.com>
- This library is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.