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