We (will) no longer need to worry about a locally-defined method named "meta"
[gitmo/Moose.git] / lib / Moose.pm
CommitLineData
fcd84ca9 1
2package Moose;
3
4use strict;
5use warnings;
6
ecb1297a 7use 5.008;
8
1aab4011 9our $VERSION = '0.64';
75b95414 10$VERSION = eval $VERSION;
d44714be 11our $AUTHORITY = 'cpan:STEVAN';
fcd84ca9 12
21f1e231 13use Scalar::Util 'blessed';
c0b37457 14use Carp 'confess', 'croak', 'cluck';
fcd84ca9 15
5bd4db9b 16use Moose::Exporter;
7f18097c 17
c13a345b 18use Class::MOP 0.75;
ef1d5f4b 19
c0e30cf5 20use Moose::Meta::Class;
7415b2cb 21use Moose::Meta::TypeConstraint;
7c13858b 22use Moose::Meta::TypeCoercion;
78cd1d3b 23use Moose::Meta::Attribute;
ddd0ec20 24use Moose::Meta::Instance;
c0e30cf5 25
0779da92 26use Moose::Object;
27
d67145ed 28use Moose::Meta::Role;
0779da92 29use Moose::Meta::Role::Composite;
30use Moose::Meta::Role::Application;
31use Moose::Meta::Role::Application::RoleSummation;
32use Moose::Meta::Role::Application::ToClass;
33use Moose::Meta::Role::Application::ToRole;
34use Moose::Meta::Role::Application::ToInstance;
d67145ed 35
7415b2cb 36use Moose::Util::TypeConstraints;
d7d8a8c7 37use Moose::Util ();
a15dff8d 38
c245d69b 39sub throw_error {
40 # FIXME This
41 shift;
42 goto \&confess
43}
4c0b3599 44
5bd4db9b 45sub extends {
97a93056 46 my $class = shift;
3d544ed5 47
5bd4db9b 48 croak "Must derive at least one class" unless @_;
9bcfbab1 49
5bd4db9b 50 my @supers = @_;
51 foreach my $super (@supers) {
52 Class::MOP::load_class($super);
53 croak "You cannot inherit from a Moose Role ($super)"
54 if $super->can('meta') &&
55 blessed $super->meta &&
56 $super->meta->isa('Moose::Meta::Role')
c92c1205 57 }
5bee491d 58
26fbace8 59
86dd5d11 60
5bd4db9b 61 # this checks the metaclass to make sure
62 # it is correct, sometimes it can get out
63 # of sync when the classes are being built
0635500e 64 my $meta = Moose::Meta::Class->initialize($class);
5bd4db9b 65 $meta->superclasses(@supers);
66}
a3c7e2fe 67
5bd4db9b 68sub with {
97a93056 69 my $class = shift;
aedcb7d9 70 Moose::Util::apply_all_roles(Class::MOP::Class->initialize($class), @_);
5bd4db9b 71}
9bcfbab1 72
5bd4db9b 73sub has {
97a93056 74 my $class = shift;
5bd4db9b 75 my $name = shift;
76 croak 'Usage: has \'name\' => ( key => value, ... )' if @_ == 1;
77 my %options = @_;
78 my $attrs = ( ref($name) eq 'ARRAY' ) ? $name : [ ($name) ];
aedcb7d9 79 Class::MOP::Class->initialize($class)->add_attribute( $_, %options ) for @$attrs;
5bd4db9b 80}
9bcfbab1 81
5bd4db9b 82sub before {
97a93056 83 my $class = shift;
5bd4db9b 84 Moose::Util::add_method_modifier($class, 'before', \@_);
85}
86
87sub after {
97a93056 88 my $class = shift;
5bd4db9b 89 Moose::Util::add_method_modifier($class, 'after', \@_);
90}
91
92sub around {
97a93056 93 my $class = shift;
5bd4db9b 94 Moose::Util::add_method_modifier($class, 'around', \@_);
95}
96
97sub super {
98 return unless our $SUPER_BODY; $SUPER_BODY->(our @SUPER_ARGS);
99}
9bcfbab1 100
5bd4db9b 101sub override {
97a93056 102 my $class = shift;
5bd4db9b 103 my ( $name, $method ) = @_;
aedcb7d9 104 Class::MOP::Class->initialize($class)->add_override_method_modifier( $name => $method );
5bd4db9b 105}
9bcfbab1 106
5bd4db9b 107sub inner {
108 my $pkg = caller();
109 our ( %INNER_BODY, %INNER_ARGS );
110
111 if ( my $body = $INNER_BODY{$pkg} ) {
112 my @args = @{ $INNER_ARGS{$pkg} };
113 local $INNER_ARGS{$pkg};
114 local $INNER_BODY{$pkg};
115 return $body->(@args);
116 } else {
117 return;
ce265cc3 118 }
5bd4db9b 119}
9bcfbab1 120
5bd4db9b 121sub augment {
97a93056 122 my $class = shift;
5bd4db9b 123 my ( $name, $method ) = @_;
aedcb7d9 124 Class::MOP::Class->initialize($class)->add_augment_method_modifier( $name => $method );
ce265cc3 125}
9bcfbab1 126
aedcb7d9 127Moose::Exporter->setup_import_methods(
97a93056 128 with_caller => [
1089b4dd 129 qw( extends with has before after around override augment)
97a93056 130 ],
131 as_is => [
132 qw( super inner ),
5bd4db9b 133 \&Carp::confess,
134 \&Scalar::Util::blessed,
135 ],
136);
137
cc841c0e 138sub init_meta {
085fba61 139 # This used to be called as a function. This hack preserves
140 # backwards compatibility.
141 if ( $_[0] ne __PACKAGE__ ) {
142 return __PACKAGE__->init_meta(
143 for_class => $_[0],
144 base_class => $_[1],
145 metaclass => $_[2],
146 );
147 }
7c4676ef 148
0338a411 149 shift;
150 my %args = @_;
151
152 my $class = $args{for_class}
c245d69b 153 or Moose->throw_error("Cannot call init_meta without specifying a for_class");
085fba61 154 my $base_class = $args{base_class} || 'Moose::Object';
155 my $metaclass = $args{metaclass} || 'Moose::Meta::Class';
cc841c0e 156
c245d69b 157 Moose->throw_error("The Metaclass $metaclass must be a subclass of Moose::Meta::Class.")
cc841c0e 158 unless $metaclass->isa('Moose::Meta::Class');
159
160 # make a subtype for each Moose class
161 class_type($class)
162 unless find_type_constraint($class);
163
164 my $meta;
50d5df60 165
166 if ( $meta = Class::MOP::get_metaclass_by_name($class) ) {
167 unless ( $meta->isa("Moose::Meta::Class") ) {
c245d69b 168 Moose->throw_error("$class already has a metaclass, but it does not inherit $metaclass ($meta)");
50d5df60 169 }
170 } else {
171 # no metaclass, no 'meta' method
172
173 # now we check whether our ancestors have metaclass, and if so borrow that
174 my ( undef, @isa ) = @{ $class->mro::get_linear_isa };
175
176 foreach my $ancestor ( @isa ) {
177 my $ancestor_meta = Class::MOP::get_metaclass_by_name($ancestor) || next;
178
179 my $ancestor_meta_class = ($ancestor_meta->is_immutable
180 ? $ancestor_meta->get_mutable_metaclass_name
181 : ref($ancestor_meta));
182
183 # if we have an ancestor metaclass that inherits $metaclass, we use
41419b9e 184 # that. This is like _fix_metaclass_incompatibility, but we can do it now.
50d5df60 185
186 # the case of having an ancestry is not very common, but arises in
187 # e.g. Reaction
188 unless ( $metaclass->isa( $ancestor_meta_class ) ) {
189 if ( $ancestor_meta_class->isa($metaclass) ) {
190 $metaclass = $ancestor_meta_class;
191 }
192 }
193 }
194
195 $meta = $metaclass->initialize($class);
196 }
197
50d5df60 198 unless ( $meta->has_method("meta") ) { # don't overwrite
50d5df60 199 # FIXME also skip this if the user requested by passing an option
cc841c0e 200 $meta->add_method(
201 'meta' => sub {
202 # re-initialize so it inherits properly
50d5df60 203 $metaclass->initialize( ref($_[0]) || $_[0] );
cc841c0e 204 }
205 );
206 }
207
208 # make sure they inherit from Moose::Object
209 $meta->superclasses($base_class)
210 unless $meta->superclasses();
211
212 return $meta;
213}
214
085fba61 215# This may be used in some older MooseX extensions.
216sub _get_caller {
217 goto &Moose::Exporter::_get_caller;
218}
219
8ecb1fa0 220## make 'em all immutable
221
3cae4250 222$_->make_immutable(
0779da92 223 inline_constructor => 1,
224 constructor_name => "_new",
3cae4250 225 # these are Class::MOP accessors, so they need inlining
226 inline_accessors => 1
227 ) for grep { $_->is_mutable }
228 map { $_->meta }
229 qw(
0779da92 230 Moose::Meta::Attribute
231 Moose::Meta::Class
232 Moose::Meta::Instance
233
0779da92 234 Moose::Meta::TypeCoercion
235 Moose::Meta::TypeCoercion::Union
236
237 Moose::Meta::Method
238 Moose::Meta::Method::Accessor
239 Moose::Meta::Method::Constructor
240 Moose::Meta::Method::Destructor
241 Moose::Meta::Method::Overriden
242 Moose::Meta::Method::Augmented
243
244 Moose::Meta::Role
245 Moose::Meta::Role::Method
246 Moose::Meta::Role::Method::Required
247
248 Moose::Meta::Role::Composite
249
250 Moose::Meta::Role::Application
251 Moose::Meta::Role::Application::RoleSummation
252 Moose::Meta::Role::Application::ToClass
253 Moose::Meta::Role::Application::ToRole
254 Moose::Meta::Role::Application::ToInstance
3cae4250 255);
8ecb1fa0 256
fcd84ca9 2571;
258
259__END__
260
261=pod
262
263=head1 NAME
264
8bdc7f13 265Moose - A postmodern object system for Perl 5
fcd84ca9 266
267=head1 SYNOPSIS
e522431d 268
269 package Point;
1cd45431 270 use Moose; # automatically turns on strict and warnings
26fbace8 271
43d599e5 272 has 'x' => (is => 'rw', isa => 'Int');
273 has 'y' => (is => 'rw', isa => 'Int');
26fbace8 274
e522431d 275 sub clear {
276 my $self = shift;
277 $self->x(0);
26fbace8 278 $self->y(0);
e522431d 279 }
26fbace8 280
e522431d 281 package Point3D;
282 use Moose;
26fbace8 283
e522431d 284 extends 'Point';
26fbace8 285
43d599e5 286 has 'z' => (is => 'rw', isa => 'Int');
26fbace8 287
e522431d 288 after 'clear' => sub {
289 my $self = shift;
43d599e5 290 $self->z(0);
26fbace8 291 };
2c0cbef7 292
fcd84ca9 293=head1 DESCRIPTION
294
26fbace8 295Moose is an extension of the Perl 5 object system.
e522431d 296
9b9da6f1 297The main goal of Moose is to make Perl 5 Object Oriented programming
298easier, more consistent and less tedious. With Moose you can to think
6f894f30 299more about what you want to do and less about the mechanics of OOP.
fcd84ca9 300
6f894f30 301Additionally, Moose is built on top of L<Class::MOP>, which is a
302metaclass system for Perl 5. This means that Moose not only makes
303building normal Perl 5 objects better, but it provides the power of
304metaclass programming as well.
8bdc7f13 305
f5909dca 306=head2 New to Moose?
307
6f894f30 308If you're new to Moose, the best place to start is the L<Moose::Intro>
309docs, followed by the L<Moose::Cookbook>. The intro will show you what
310Moose is, and how it makes Perl 5 OO better.
311
312The cookbook recipes on Moose basics will get you up to speed with
313many of Moose's features quickly. Once you have an idea of what Moose
314can do, you can use the API documentation to get more detail on
315features which interest you.
f5909dca 316
28669f89 317=head2 Moose Extensions
318
12aed9a0 319The C<MooseX::> namespace is the official place to find Moose extensions.
320These extensions can be found on the CPAN. The easiest way to find them
321is to search for them (L<http://search.cpan.org/search?query=MooseX::>),
322or to examine L<Task::Moose> which aims to keep an up-to-date, easily
323installable list of Moose extensions.
28669f89 324
6ba6d68c 325=head1 BUILDING CLASSES WITH MOOSE
326
68efb014 327Moose makes every attempt to provide as much convenience as possible during
328class construction/definition, but still stay out of your way if you want it
329to. Here are a few items to note when building classes with Moose.
6ba6d68c 330
26fbace8 331Unless specified with C<extends>, any class which uses Moose will
6ba6d68c 332inherit from L<Moose::Object>.
333
1cd45431 334Moose will also manage all attributes (including inherited ones) that are
335defined with C<has>. And (assuming you call C<new>, which is inherited from
336L<Moose::Object>) this includes properly initializing all instance slots,
337setting defaults where appropriate, and performing any type constraint checking
338or coercion.
6ba6d68c 339
004222dc 340=head1 PROVIDED METHODS
6ba6d68c 341
004222dc 342Moose provides a number of methods to all your classes, mostly through the
343inheritance of L<Moose::Object>. There is however, one exception.
6ba6d68c 344
345=over 4
346
347=item B<meta>
348
349This is a method which provides access to the current class's metaclass.
350
004222dc 351=back
352
353=head1 EXPORTED FUNCTIONS
354
355Moose will export a number of functions into the class's namespace which
356may then be used to set up the class. These functions all work directly
357on the current class.
358
359=over 4
360
6ba6d68c 361=item B<extends (@superclasses)>
362
363This function will set the superclass(es) for the current class.
364
26fbace8 365This approach is recommended instead of C<use base>, because C<use base>
366actually C<push>es onto the class's C<@ISA>, whereas C<extends> will
367replace it. This is important to ensure that classes which do not have
68efb014 368superclasses still properly inherit from L<Moose::Object>.
6ba6d68c 369
43d599e5 370=item B<with (@roles)>
e9ec68d6 371
004222dc 372This will apply a given set of C<@roles> to the local class.
e9ec68d6 373
b4291ab4 374=item B<has $name|@$names =E<gt> %options>
6ba6d68c 375
b4291ab4 376This will install an attribute of a given C<$name> into the current class. If
377the first parameter is an array reference, it will create an attribute for
378every C<$name> in the list. The C<%options> are the same as those provided by
379L<Class::MOP::Attribute>, in addition to the list below which are provided by
380Moose (L<Moose::Meta::Attribute> to be more specific):
6ba6d68c 381
382=over 4
383
076c81ed 384=item I<is =E<gt> 'rw'|'ro'>
6ba6d68c 385
26fbace8 386The I<is> option accepts either I<rw> (for read/write) or I<ro> (for read
387only). These will create either a read/write accessor or a read-only
6ba6d68c 388accessor respectively, using the same name as the C<$name> of the attribute.
389
1b46b845 390If you need more control over how your accessors are named, you can
391use the L<reader|Class::MOP::Attribute/reader>,
392L<writer|Class::MOP::Attribute/writer> and
393L<accessor|Class::MOP::Attribute/accessor> options inherited from
394L<Class::MOP::Attribute>, however if you use those, you won't need the
395I<is> option.
6ba6d68c 396
076c81ed 397=item I<isa =E<gt> $type_name>
6ba6d68c 398
26fbace8 399The I<isa> option uses Moose's type constraint facilities to set up runtime
400type checking for this attribute. Moose will perform the checks during class
401construction, and within any accessors. The C<$type_name> argument must be a
402string. The string may be either a class name or a type defined using
9cca2e9e 403Moose's type definition features. (Refer to L<Moose::Util::TypeConstraints>
c2a69ef1 404for information on how to define a new type, and how to retrieve type meta-data).
6ba6d68c 405
daea75c9 406=item I<coerce =E<gt> (1|0)>
407
26fbace8 408This will attempt to use coercion with the supplied type constraint to change
409the value passed into any accessors or constructors. You B<must> have supplied
5cfe3805 410a type constraint in order for this to work. See L<Moose::Cookbook::Basics::Recipe5>
1cd45431 411for an example.
daea75c9 412
413=item I<does =E<gt> $role_name>
414
26fbace8 415This will accept the name of a role which the value stored in this attribute
daea75c9 416is expected to have consumed.
417
418=item I<required =E<gt> (1|0)>
419
26fbace8 420This marks the attribute as being required. This means a I<defined> value must be
421supplied during class construction, and the attribute may never be set to
422C<undef> with an accessor.
daea75c9 423
424=item I<weak_ref =E<gt> (1|0)>
425
68efb014 426This will tell the class to store the value of this attribute as a weakened
427reference. If an attribute is a weakened reference, it B<cannot> also be
428coerced.
daea75c9 429
430=item I<lazy =E<gt> (1|0)>
431
26fbace8 432This will tell the class to not create this slot until absolutely necessary.
daea75c9 433If an attribute is marked as lazy it B<must> have a default supplied.
434
9e93dd19 435=item I<auto_deref =E<gt> (1|0)>
436
26fbace8 437This tells the accessor whether to automatically dereference the value returned.
1cd45431 438This is only legal if your C<isa> option is either C<ArrayRef> or C<HashRef>.
9e93dd19 439
65e14c86 440=item I<trigger =E<gt> $code>
441
442The I<trigger> option is a CODE reference which will be called after the value of
443the attribute is set. The CODE ref will be passed the instance itself, the
444updated value and the attribute meta-object (this is for more advanced fiddling
445and can typically be ignored). You B<cannot> have a trigger on a read-only
010997ca 446attribute.
447
448B<NOTE:> Triggers will only fire when you B<assign> to the attribute,
449either in the constructor, or using the writer. Default and built values will
450B<not> cause the trigger to be fired.
daea75c9 451
c84f324f 452=item I<handles =E<gt> ARRAY | HASH | REGEXP | ROLE | CODE>
2c0cbef7 453
26fbace8 454The I<handles> option provides Moose classes with automated delegation features.
455This is a pretty complex and powerful option. It accepts many different option
456formats, each with its own benefits and drawbacks.
38e3283b 457
1cd45431 458B<NOTE:> The class being delegated to does not need to be a Moose based class,
459which is why this feature is especially useful when wrapping non-Moose classes.
38e3283b 460
1cd45431 461All I<handles> option formats share the following traits:
38e3283b 462
1cd45431 463You cannot override a locally defined method with a delegated method; an
464exception will be thrown if you try. That is to say, if you define C<foo> in
465your class, you cannot override it with a delegated C<foo>. This is almost never
466something you would want to do, and if it is, you should do it by hand and not
467use Moose.
38e3283b 468
1cd45431 469You cannot override any of the methods found in Moose::Object, or the C<BUILD>
470and C<DEMOLISH> methods. These will not throw an exception, but will silently
471move on to the next method in the list. My reasoning for this is that you would
472almost never want to do this, since it usually breaks your class. As with
473overriding locally defined methods, if you do want to do this, you should do it
474manually, not with Moose.
38e3283b 475
f3c4e20e 476You do not I<need> to have a reader (or accessor) for the attribute in order
477to delegate to it. Moose will create a means of accessing the value for you,
478however this will be several times B<less> efficient then if you had given
479the attribute a reader (or accessor) to use.
480
38e3283b 481Below is the documentation for each option format:
482
483=over 4
484
485=item C<ARRAY>
486
26fbace8 487This is the most common usage for I<handles>. You basically pass a list of
488method names to be delegated, and Moose will install a delegation method
1cd45431 489for each one.
38e3283b 490
491=item C<HASH>
492
26fbace8 493This is the second most common usage for I<handles>. Instead of a list of
494method names, you pass a HASH ref where each key is the method name you
495want installed locally, and its value is the name of the original method
496in the class being delegated to.
fd595040 497
26fbace8 498This can be very useful for recursive classes like trees. Here is a
5cfe3805 499quick example (soon to be expanded into a Moose::Cookbook recipe):
38e3283b 500
1cd45431 501 package Tree;
38e3283b 502 use Moose;
26fbace8 503
38e3283b 504 has 'node' => (is => 'rw', isa => 'Any');
26fbace8 505
38e3283b 506 has 'children' => (
507 is => 'ro',
508 isa => 'ArrayRef',
509 default => sub { [] }
510 );
26fbace8 511
38e3283b 512 has 'parent' => (
513 is => 'rw',
514 isa => 'Tree',
a4e516f6 515 weak_ref => 1,
38e3283b 516 handles => {
517 parent_node => 'node',
26fbace8 518 siblings => 'children',
38e3283b 519 }
520 );
521
1cd45431 522In this example, the Tree package gets C<parent_node> and C<siblings> methods,
523which delegate to the C<node> and C<children> methods (respectively) of the Tree
26fbace8 524instance stored in the C<parent> slot.
38e3283b 525
526=item C<REGEXP>
527
26fbace8 528The regexp option works very similar to the ARRAY option, except that it builds
529the list of methods for you. It starts by collecting all possible methods of the
530class being delegated to, then filters that list using the regexp supplied here.
38e3283b 531
26fbace8 532B<NOTE:> An I<isa> option is required when using the regexp option format. This
533is so that we can determine (at compile time) the method list from the class.
38e3283b 534Without an I<isa> this is just not possible.
535
c84f324f 536=item C<ROLE>
537
26fbace8 538With the role option, you specify the name of a role whose "interface" then
539becomes the list of methods to handle. The "interface" can be defined as; the
540methods of the role and any required methods of the role. It should be noted
541that this does B<not> include any method modifiers or generated attribute
c84f324f 542methods (which is consistent with role composition).
543
38e3283b 544=item C<CODE>
545
1cd45431 546This is the option to use when you really want to do something funky. You should
547only use it if you really know what you are doing, as it involves manual
548metaclass twiddling.
38e3283b 549
1cd45431 550This takes a code reference, which should expect two arguments. The first is the
551attribute meta-object this I<handles> is attached to. The second is the
552metaclass of the class being delegated to. It expects you to return a hash (not
26fbace8 553a HASH ref) of the methods you want mapped.
38e3283b 554
555=back
2c0cbef7 556
004222dc 557=item I<metaclass =E<gt> $metaclass_name>
558
559This tells the class to use a custom attribute metaclass for this particular
560attribute. Custom attribute metaclasses are useful for extending the
561capabilities of the I<has> keyword: they are the simplest way to extend the MOP,
562but they are still a fairly advanced topic and too much to cover here, see
5cfe3805 563L<Moose::Cookbook::Meta::Recipe1> for more information.
004222dc 564
565The default behavior here is to just load C<$metaclass_name>; however, we also
566have a way to alias to a shorter name. This will first look to see if
567B<Moose::Meta::Attribute::Custom::$metaclass_name> exists. If it does, Moose
568will then check to see if that has the method C<register_implementation>, which
569should return the actual name of the custom attribute metaclass. If there is no
570C<register_implementation> method, it will fall back to using
571B<Moose::Meta::Attribute::Custom::$metaclass_name> as the metaclass name.
572
573=item I<traits =E<gt> [ @role_names ]>
574
575This tells Moose to take the list of C<@role_names> and apply them to the
576attribute meta-object. This is very similar to the I<metaclass> option, but
54f2996d 577allows you to use more than one extension at a time.
004222dc 578
54f2996d 579See L<TRAIT NAME RESOLUTION> for details on how a trait name is
580resolved to a class name.
581
582Also see L<Moose::Cookbook::Meta::Recipe3> for a metaclass trait
583example.
004222dc 584
019f031d 585=item I<builder> => Str
010997ca 586
1b46b845 587The value of this key is the name of the method that will be called to
588obtain the value used to initialize the attribute. See the L<builder
589option docs in Class::MOP::Attribute|Class::MOP::Attribute/builder>
590for more information.
010997ca 591
019f031d 592=item I<default> => SCALAR | CODE
010997ca 593
594The value of this key is the default value which will initialize the attribute.
595
1b46b845 596NOTE: If the value is a simple scalar (string or number), then it can
597be just passed as is. However, if you wish to initialize it with a
598HASH or ARRAY ref, then you need to wrap that inside a CODE reference.
599See the L<default option docs in
600Class::MOP::Attribute|Class::MOP::Attribute/default> for more
601information.
010997ca 602
019f031d 603=item I<initializer> => Str
010997ca 604
1b46b845 605This may be a method name (referring to a method on the class with
606this attribute) or a CODE ref. The initializer is used to set the
607attribute value on an instance when the attribute is set during
608instance initialization (but not when the value is being assigned
609to). See the L<initializer option docs in
610Class::MOP::Attribute|Class::MOP::Attribute/initializer> for more
611information.
010997ca 612
019f031d 613=item I<clearer> => Str
010997ca 614
1b46b845 615Allows you to clear the value, see the L<clearer option docs in
616Class::MOP::Attribute|Class::MOP::Attribute/clearer> for more
617information.
010997ca 618
019f031d 619=item I<predicate> => Str
010997ca 620
1b46b845 621Basic test to see if a value has been set in the attribute, see the
622L<predicate option docs in
623Class::MOP::Attribute|Class::MOP::Attribute/predicate> for more
624information.
010997ca 625
019f031d 626=item I<lazy_build> => (0|1)
627
628Automatically define lazy => 1 as well as builder => "_build_$attr", clearer =>
629"clear_$attr', predicate => 'has_$attr' unless they are already defined.
630
631
6ba6d68c 632=back
633
cd7eeaf5 634=item B<has +$name =E<gt> %options>
635
c7874946 636This is variation on the normal attribute creator C<has> which allows you to
8d62bf6d 637clone and extend an attribute from a superclass or from a role. Here is an
638example of the superclass usage:
cd7eeaf5 639
640 package Foo;
641 use Moose;
26fbace8 642
cd7eeaf5 643 has 'message' => (
26fbace8 644 is => 'rw',
cd7eeaf5 645 isa => 'Str',
646 default => 'Hello, I am a Foo'
647 );
26fbace8 648
cd7eeaf5 649 package My::Foo;
650 use Moose;
26fbace8 651
cd7eeaf5 652 extends 'Foo';
26fbace8 653
cd7eeaf5 654 has '+message' => (default => 'Hello I am My::Foo');
655
1cd45431 656What is happening here is that B<My::Foo> is cloning the C<message> attribute
657from its parent class B<Foo>, retaining the C<is =E<gt> 'rw'> and C<isa =E<gt>
658'Str'> characteristics, but changing the value in C<default>.
cd7eeaf5 659
8d62bf6d 660Here is another example, but within the context of a role:
661
662 package Foo::Role;
663 use Moose::Role;
986d175a 664
8d62bf6d 665 has 'message' => (
666 is => 'rw',
667 isa => 'Str',
668 default => 'Hello, I am a Foo'
669 );
986d175a 670
8d62bf6d 671 package My::Foo;
672 use Moose;
986d175a 673
8d62bf6d 674 with 'Foo::Role';
986d175a 675
8d62bf6d 676 has '+message' => (default => 'Hello I am My::Foo');
677
678In this case, we are basically taking the attribute which the role supplied
4032c9bb 679and altering it within the bounds of this feature.
8d62bf6d 680
4032c9bb 681Aside from where the attributes come from (one from superclass, the other
682from a role), this feature works exactly the same. This feature is restricted
683somewhat, so as to try and force at least I<some> sanity into it. You are only
684allowed to change the following attributes:
cd7eeaf5 685
686=over 4
687
26fbace8 688=item I<default>
cd7eeaf5 689
690Change the default value of an attribute.
691
26fbace8 692=item I<coerce>
cd7eeaf5 693
694Change whether the attribute attempts to coerce a value passed to it.
695
26fbace8 696=item I<required>
cd7eeaf5 697
698Change if the attribute is required to have a value.
699
700=item I<documentation>
701
702Change the documentation string associated with the attribute.
703
83cc9094 704=item I<lazy>
705
706Change if the attribute lazily initializes the slot.
707
cd7eeaf5 708=item I<isa>
709
aed87761 710You I<are> allowed to change the type without restriction.
711
712It is recommended that you use this freedom with caution. We used to
713only allow for extension only if the type was a subtype of the parent's
714type, but we felt that was too restrictive and is better left as a
c7874946 715policy decision.
cd7eeaf5 716
83cc9094 717=item I<handles>
718
26fbace8 719You are allowed to B<add> a new C<handles> definition, but you are B<not>
720allowed to I<change> one.
83cc9094 721
8d62bf6d 722=item I<builder>
723
724You are allowed to B<add> a new C<builder> definition, but you are B<not>
725allowed to I<change> one.
726
13284479 727=item I<metaclass>
728
729You are allowed to B<add> a new C<metaclass> definition, but you are
730B<not> allowed to I<change> one.
731
732=item I<traits>
733
734You are allowed to B<add> additional traits to the C<traits> definition.
735These traits will be composed into the attribute, but pre-existing traits
736B<are not> overridden, or removed.
737
cd7eeaf5 738=back
739
076c81ed 740=item B<before $name|@names =E<gt> sub { ... }>
6ba6d68c 741
076c81ed 742=item B<after $name|@names =E<gt> sub { ... }>
6ba6d68c 743
076c81ed 744=item B<around $name|@names =E<gt> sub { ... }>
6ba6d68c 745
d8af92ae 746This three items are syntactic sugar for the before, after, and around method
747modifier features that L<Class::MOP> provides. More information on these may be
748found in the L<Class::MOP::Class documentation|Class::MOP::Class/"Method
749Modifiers"> for now.
6ba6d68c 750
159da176 751=item B<super>
752
26fbace8 753The keyword C<super> is a no-op when called outside of an C<override> method. In
754the context of an C<override> method, it will call the next most appropriate
159da176 755superclass method with the same arguments as the original method.
756
757=item B<override ($name, &sub)>
758
26fbace8 759An C<override> method is a way of explicitly saying "I am overriding this
760method from my superclass". You can call C<super> within this method, and
761it will work as expected. The same thing I<can> be accomplished with a normal
762method call and the C<SUPER::> pseudo-package; it is really your choice.
159da176 763
764=item B<inner>
765
26fbace8 766The keyword C<inner>, much like C<super>, is a no-op outside of the context of
767an C<augment> method. You can think of C<inner> as being the inverse of
68efb014 768C<super>; the details of how C<inner> and C<augment> work is best described in
5cfe3805 769the L<Moose::Cookbook::Basics::Recipe6>.
159da176 770
771=item B<augment ($name, &sub)>
772
26fbace8 773An C<augment> method, is a way of explicitly saying "I am augmenting this
774method from my superclass". Once again, the details of how C<inner> and
5cfe3805 775C<augment> work is best described in the L<Moose::Cookbook::Basics::Recipe6>.
159da176 776
6ba6d68c 777=item B<confess>
778
68efb014 779This is the C<Carp::confess> function, and exported here because I use it
004222dc 780all the time.
6ba6d68c 781
782=item B<blessed>
783
1cd45431 784This is the C<Scalar::Util::blessed> function, it is exported here because I
26fbace8 785use it all the time. It is highly recommended that this is used instead of
6ba6d68c 786C<ref> anywhere you need to test for an object's class name.
787
788=back
789
54f2996d 790=head1 METACLASS TRAITS
791
792When you use Moose, you can also specify traits which will be applied
793to your metaclass:
794
795 use Moose -traits => 'My::Trait';
796
797This is very similar to the attribute traits feature. When you do
798this, your class's C<meta> object will have the specified traits
799applied to it. See L<TRAIT NAME RESOLUTION> for more details.
800
801=head1 TRAIT NAME RESOLUTION
802
803By default, when given a trait name, Moose simply tries to load a
804class of the same name. If such a class does not exist, it then looks
805for for a class matching
806B<Moose::Meta::$type::Custom::Trait::$trait_name>. The C<$type>
807variable here will be one of B<Attribute> or B<Class>, depending on
808what the trait is being applied to.
809
810If a class with this long name exists, Moose checks to see if it has
811the method C<register_implementation>. This method is expected to
812return the I<real> class name of the trait. If there is no
813C<register_implementation> method, it will fall back to using
814B<Moose::Meta::$type::Custom::Trait::$trait> as the trait name.
815
816If all this is confusing, take a look at
817L<Moose::Cookbook::Meta::Recipe3>, which demonstrates how to create an
818attribute trait.
819
1cd45431 820=head1 UNIMPORTING FUNCTIONS
31f8ec72 821
822=head2 B<unimport>
823
1cd45431 824Moose offers a way to remove the keywords it exports, through the C<unimport>
31f8ec72 825method. You simply have to say C<no Moose> at the bottom of your code for this
826to work. Here is an example:
827
828 package Person;
829 use Moose;
830
831 has 'first_name' => (is => 'rw', isa => 'Str');
832 has 'last_name' => (is => 'rw', isa => 'Str');
26fbace8 833
834 sub full_name {
31f8ec72 835 my $self = shift;
26fbace8 836 $self->first_name . ' ' . $self->last_name
31f8ec72 837 }
26fbace8 838
839 no Moose; # keywords are removed from the Person package
31f8ec72 840
9bcfbab1 841=head1 EXTENDING AND EMBEDDING MOOSE
842
5e86efbe 843To learn more about extending Moose, we recommend checking out the
844"Extending" recipes in the L<Moose::Cookbook>, starting with
845L<Moose::Cookbook::Extending::Recipe1>, which provides an overview of
846all the different ways you might extend Moose.
554b7648 847
848=head2 B<< Moose->init_meta(for_class => $class, base_class => $baseclass, metaclass => $metaclass) >>
9bcfbab1 849
554b7648 850The C<init_meta> method sets up the metaclass object for the class
b143539e 851specified by C<for_class>. This method injects a a C<meta> accessor
852into the class so you can get at this object. It also sets the class's
554b7648 853superclass to C<base_class>, with L<Moose::Object> as the default.
9bcfbab1 854
554b7648 855You can specify an alternate metaclass with the C<metaclass> parameter.
26fbace8 856
80837fe1 857For more detail on this topic, see L<Moose::Cookbook::Extending::Recipe2>.
858
554b7648 859This method used to be documented as a function which accepted
860positional parameters. This calling style will still work for
4a66a4b3 861backwards compatibility, but is deprecated.
554b7648 862
863=head2 B<import>
864
865Moose's C<import> method supports the L<Sub::Exporter> form of C<{into =E<gt> $pkg}>
866and C<{into_level =E<gt> 1}>.
867
868B<NOTE>: Doing this is more or less deprecated. Use L<Moose::Exporter>
869instead, which lets you stack multiple C<Moose.pm>-alike modules
870sanely. It handles getting the exported functions into the right place
871for you.
872
23d3fe84 873=head2 B<throw_error>
4c0b3599 874
875An alias for C<confess>, used by internally by Moose.
876
6ea5491a 877=head1 METACLASS COMPATIBILITY AND MOOSE
878
879Metaclass compatibility is a thorny subject. You should start by
880reading the "About Metaclass compatibility" section in the
881C<Class::MOP> docs.
882
883Moose will attempt to resolve a few cases of metaclass incompatibility
884when you set the superclasses for a class, unlike C<Class::MOP>, which
885simply dies if the metaclasses are incompatible.
886
887In actuality, Moose fixes incompatibility for I<all> of a class's
888metaclasses, not just the class metaclass. That includes the instance
889metaclass, attribute metaclass, as well as its constructor class and
890destructor class. However, for simplicity this discussion will just
891refer to "metaclass", meaning the class metaclass, most of the time.
892
893Moose has two algorithms for fixing metaclass incompatibility.
894
895The first algorithm is very simple. If all the metaclass for the
896parent is a I<subclass> of the child's metaclass, then we simply
897replace the child's metaclass with the parent's.
898
899The second algorithm is more complicated. It tries to determine if the
900metaclasses only "differ by roles". This means that the parent and
901child's metaclass share a common ancestor in their respective
902hierarchies, and that the subclasses under the common ancestor are
903only different because of role applications. This case is actually
904fairly common when you mix and match various C<MooseX::*> modules,
905many of which apply roles to the metaclass.
906
907If the parent and child do differ by roles, Moose replaces the
908metaclass in the child with a newly created metaclass. This metaclass
909is a subclass of the parent's metaclass, does all of the roles that
910the child's metaclass did before being replaced. Effectively, this
911means the new metaclass does all of the roles done by both the
912parent's and child's original metaclasses.
913
914Ultimately, this is all transparent to you except in the case of an
915unresolvable conflict.
916
fafec530 917=head2 The MooseX:: namespace
918
919Generally if you're writing an extension I<for> Moose itself you'll want
920to put your extension in the C<MooseX::> namespace. This namespace is
921specifically for extensions that make Moose better or different in some
922fundamental way. It is traditionally B<not> for a package that just happens
923to use Moose. This namespace follows from the examples of the C<LWPx::>
924and C<DBIx::> namespaces that perform the same function for C<LWP> and C<DBI>
925respectively.
926
05d9eaf6 927=head1 CAVEATS
928
929=over 4
930
931=item *
932
1cd45431 933It should be noted that C<super> and C<inner> B<cannot> be used in the same
934method. However, they may be combined within the same class hierarchy; see
935F<t/014_override_augment_inner_super.t> for an example.
05d9eaf6 936
26fbace8 937The reason for this is that C<super> is only valid within a method
938with the C<override> modifier, and C<inner> will never be valid within an
939C<override> method. In fact, C<augment> will skip over any C<override> methods
68efb014 940when searching for its appropriate C<inner>.
05d9eaf6 941
1cd45431 942This might seem like a restriction, but I am of the opinion that keeping these
943two features separate (yet interoperable) actually makes them easy to use, since
944their behavior is then easier to predict. Time will tell whether I am right or
c84f324f 945not (UPDATE: so far so good).
05d9eaf6 946
9b9da6f1 947=back
948
5569c072 949=head1 ACKNOWLEDGEMENTS
950
951=over 4
952
54c189df 953=item I blame Sam Vilain for introducing me to the insanity that is meta-models.
5569c072 954
54c189df 955=item I blame Audrey Tang for then encouraging my meta-model habit in #perl6.
5569c072 956
26fbace8 957=item Without Yuval "nothingmuch" Kogman this module would not be possible,
54c189df 958and it certainly wouldn't have this name ;P
5569c072 959
26fbace8 960=item The basis of the TypeContraints module was Rob Kinyon's idea
5569c072 961originally, I just ran with it.
962
638585e1 963=item Thanks to mst & chansen and the whole #moose posse for all the
c84f324f 964early ideas/feature-requests/encouragement/bug-finding.
d46a48f3 965
68efb014 966=item Thanks to David "Theory" Wheeler for meta-discussions and spelling fixes.
967
5569c072 968=back
969
e90c03d0 970=head1 SEE ALSO
971
972=over 4
973
c84f324f 974=item L<http://www.iinteractive.com/moose>
975
976This is the official web home of Moose, it contains links to our public SVN repo
26fbace8 977as well as links to a number of talks and articles on Moose and Moose related
978technologies.
c84f324f 979
196064ab 980=item L<Moose::Cookbook> - How to cook a Moose
981
982=item The Moose is flying, a tutorial by Randal Schwartz
983
984Part 1 - L<http://www.stonehenge.com/merlyn/LinuxMag/col94.html>
985
986Part 2 - L<http://www.stonehenge.com/merlyn/LinuxMag/col95.html>
987
6ba6d68c 988=item L<Class::MOP> documentation
989
990=item The #moose channel on irc.perl.org
991
e67a0fca 992=item The Moose mailing list - moose@perl.org
993
9e0361e1 994=item Moose stats on ohloh.net - L<http://www.ohloh.net/projects/moose>
c84f324f 995
12aed9a0 996=item Several Moose extension modules in the C<MooseX::> namespace.
997
998See L<http://search.cpan.org/search?query=MooseX::> for extensions.
28669f89 999
c84f324f 1000=back
1001
004222dc 1002=head2 Books
1003
1004=over 4
1005
1006=item The Art of the MetaObject Protocol
1007
1008I mention this in the L<Class::MOP> docs too, this book was critical in
1009the development of both modules and is highly recommended.
1010
1011=back
1012
26fbace8 1013=head2 Papers
c84f324f 1014
1015=over 4
e90c03d0 1016
159da176 1017=item L<http://www.cs.utah.edu/plt/publications/oopsla04-gff.pdf>
1018
26fbace8 1019This paper (suggested by lbr on #moose) was what lead to the implementation
1020of the C<super>/C<override> and C<inner>/C<augment> features. If you really
1cd45431 1021want to understand them, I suggest you read this.
159da176 1022
e90c03d0 1023=back
1024
fcd84ca9 1025=head1 BUGS
1026
26fbace8 1027All complex software has bugs lurking in it, and this module is no
fcd84ca9 1028exception. If you find a bug please either email me, or add the bug
1029to cpan-RT.
1030
47b19570 1031=head1 FEATURE REQUESTS
1032
1033We are very strict about what features we add to the Moose core, especially
1034the user-visible features. Instead we have made sure that the underlying
1035meta-system of Moose is as extensible as possible so that you can add your
1036own features easily. That said, occasionally there is a feature needed in the
1037meta-system to support your planned extension, in which case you should
1038either email the mailing list or join us on irc at #moose to discuss.
1039
fcd84ca9 1040=head1 AUTHOR
1041
862ae2c4 1042Moose is an open project, there are at this point dozens of people who have
1043contributed, and can contribute. If you have added anything to the Moose
1044project you have a commit bit on this file and can add your name to the list.
fcd84ca9 1045
862ae2c4 1046=head2 CABAL
1047
1048However there are only a few people with the rights to release a new version
1049of Moose. The Moose Cabal are the people to go to with questions regarding
a4869d1e 1050the wider purview of Moose, and help out maintaining not just the code
958dc4e3 1051but the community as well.
862ae2c4 1052
1053Stevan (stevan) Little E<lt>stevan@iinteractive.comE<gt>
1054
862ae2c4 1055Yuval (nothingmuch) Kogman
1056
1057Shawn (sartak) Moore
1058
7a706548 1059Dave (autarch) Rolsky E<lt>autarch@urth.orgE<gt>
5c5e5480 1060
862ae2c4 1061=head2 OTHER CONTRIBUTORS
db1ab48d 1062
9af1d28b 1063Aankhen
1064
1065Adam (Alias) Kennedy
1066
1067Anders (Debolaz) Nor Berle
1068
5868294f 1069Nathan (kolibre) Gray
1070
9af1d28b 1071Christian (chansen) Hansen
1072
e7f8d0c2 1073Hans Dieter (confound) Pearcey
1074
9af1d28b 1075Eric (ewilhelm) Wilhelm
1076
1077Guillermo (groditi) Roditi
1078
1079Jess (castaway) Robinson
1080
1081Matt (mst) Trout
1082
1083Robert (phaylon) Sedlacek
1084
1085Robert (rlb3) Boone
1086
1087Scott (konobi) McWhirter
1088
f44ae52f 1089Shlomi (rindolf) Fish
1090
cbe25729 1091Chris (perigrin) Prather
1092
68b6146c 1093Wallace (wreis) Reis
1094
e46f5cc2 1095Jonathan (jrockway) Rockway
1096
3ccdc84a 1097Piotr (dexter) Roszatycki
1098
26fbace8 1099Sam (mugwump) Vilain
f1917f58 1100
2f7e4042 1101Cory (gphat) Watson
1102
9af1d28b 1103... and many other #moose folks
98aae381 1104
fcd84ca9 1105=head1 COPYRIGHT AND LICENSE
1106
778db3ac 1107Copyright 2006-2008 by Infinity Interactive, Inc.
fcd84ca9 1108
1109L<http://www.iinteractive.com>
1110
1111This library is free software; you can redistribute it and/or modify
26fbace8 1112it under the same terms as Perl itself.
fcd84ca9 1113
ddd0ec20 1114=cut