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