TypeConstraint::Union->includes_type in the changelog
[gitmo/Moose.git] / lib / Moose.pm
CommitLineData
fcd84ca9 1
2package Moose;
3
4use strict;
5use warnings;
6
c2922d69 7our $VERSION = '0.41';
d44714be 8our $AUTHORITY = 'cpan:STEVAN';
fcd84ca9 9
cc65ead0 10use Scalar::Util 'blessed', 'reftype';
3796382a 11use Carp 'confess';
12use Sub::Name 'subname';
fcd84ca9 13
2d562421 14use Sub::Exporter;
7f18097c 15
c2922d69 16use Class::MOP;
ef1d5f4b 17
c0e30cf5 18use Moose::Meta::Class;
7415b2cb 19use Moose::Meta::TypeConstraint;
3fef8ce8 20use Moose::Meta::TypeConstraint::Class;
7c13858b 21use Moose::Meta::TypeCoercion;
78cd1d3b 22use Moose::Meta::Attribute;
ddd0ec20 23use Moose::Meta::Instance;
c0e30cf5 24
d67145ed 25use Moose::Meta::Role;
26
fcd84ca9 27use Moose::Object;
7415b2cb 28use Moose::Util::TypeConstraints;
d7d8a8c7 29use Moose::Util ();
a15dff8d 30
a3c7e2fe 31{
be33e4f3 32 my $CALLER;
9bcfbab1 33
34 sub init_meta {
35 my ( $class, $base_class, $metaclass ) = @_;
688fcdda 36 $base_class = 'Moose::Object' unless defined $base_class;
37 $metaclass = 'Moose::Meta::Class' unless defined $metaclass;
9bcfbab1 38
39 confess
97e11ef5 40 "The Metaclass $metaclass must be a subclass of Moose::Meta::Class."
41 unless $metaclass->isa('Moose::Meta::Class');
a3c7e2fe 42
a3c7e2fe 43 # make a subtype for each Moose class
3fef8ce8 44 class_type($class)
45 unless find_type_constraint($class);
a3c7e2fe 46
47 my $meta;
9bcfbab1 48 if ( $class->can('meta') ) {
fcec2383 49 # NOTE:
9bcfbab1 50 # this is the case where the metaclass pragma
51 # was used before the 'use Moose' statement to
fcec2383 52 # override a specific class
a3c7e2fe 53 $meta = $class->meta();
9bcfbab1 54 ( blessed($meta) && $meta->isa('Moose::Meta::Class') )
1edfdf1c 55 || confess "You already have a &meta function, but it does not return a Moose::Meta::Class";
a3c7e2fe 56 }
57 else {
fcec2383 58 # NOTE:
9bcfbab1 59 # this is broken currently, we actually need
60 # to allow the possiblity of an inherited
61 # meta, which will not be visible until the
62 # user 'extends' first. This needs to have
63 # more intelligence to it
64 $meta = $metaclass->initialize($class);
65 $meta->add_method(
66 'meta' => sub {
9bcfbab1 67 # re-initialize so it inherits properly
68 $metaclass->initialize( blessed( $_[0] ) || $_[0] );
69 }
70 );
a3c7e2fe 71 }
72
73 # make sure they inherit from Moose::Object
72bbc189 74 $meta->superclasses($base_class)
9bcfbab1 75 unless $meta->superclasses();
688fcdda 76
77 return $meta;
a3c7e2fe 78 }
79
80 my %exports = (
81 extends => sub {
be33e4f3 82 my $class = $CALLER;
68117c45 83 return subname 'Moose::extends' => sub (@) {
84 confess "Must derive at least one class" unless @_;
9c10b5ad 85
86 my @supers = @_;
87 foreach my $super (@supers) {
88 Class::MOP::load_class($super);
89 }
9bcfbab1 90
91 # this checks the metaclass to make sure
92 # it is correct, sometimes it can get out
1341f10c 93 # of sync when the classes are being built
9c10b5ad 94 my $meta = $class->meta->_fix_metaclass_incompatability(@supers);
95 $meta->superclasses(@supers);
a3c7e2fe 96 };
97 },
98 with => sub {
be33e4f3 99 my $class = $CALLER;
68117c45 100 return subname 'Moose::with' => sub (@) {
d7d8a8c7 101 Moose::Util::apply_all_roles($class->meta, @_)
a3c7e2fe 102 };
103 },
104 has => sub {
be33e4f3 105 my $class = $CALLER;
2c0cbef7 106 return subname 'Moose::has' => sub ($;%) {
a28fe77b 107 my $name = shift;
108 die 'Usage: has \'name\' => ( key => value, ... )' if @_ == 1;
109 my %options = @_;
9bcfbab1 110 my $attrs = ( ref($name) eq 'ARRAY' ) ? $name : [ ($name) ];
d7d8a8c7 111 $class->meta->add_attribute( $_, %options ) for @$attrs;
a3c7e2fe 112 };
113 },
114 before => sub {
be33e4f3 115 my $class = $CALLER;
2c0cbef7 116 return subname 'Moose::before' => sub (@&) {
a3c7e2fe 117 my $code = pop @_;
be33e4f3 118 my $meta = $class->meta;
9bcfbab1 119 $meta->add_before_method_modifier( $_, $code ) for @_;
a3c7e2fe 120 };
121 },
122 after => sub {
be33e4f3 123 my $class = $CALLER;
2c0cbef7 124 return subname 'Moose::after' => sub (@&) {
a3c7e2fe 125 my $code = pop @_;
be33e4f3 126 my $meta = $class->meta;
9bcfbab1 127 $meta->add_after_method_modifier( $_, $code ) for @_;
a3c7e2fe 128 };
129 },
130 around => sub {
9bcfbab1 131 my $class = $CALLER;
2c0cbef7 132 return subname 'Moose::around' => sub (@&) {
a3c7e2fe 133 my $code = pop @_;
be33e4f3 134 my $meta = $class->meta;
9bcfbab1 135 $meta->add_around_method_modifier( $_, $code ) for @_;
a3c7e2fe 136 };
137 },
138 super => sub {
52c7c330 139 {
9bcfbab1 140 our %SUPER_SLOT;
141 no strict 'refs';
142 $SUPER_SLOT{$CALLER} = \*{"${CALLER}::super"};
52c7c330 143 }
9bcfbab1 144 return subname 'Moose::super' => sub { };
a3c7e2fe 145 },
146 override => sub {
be33e4f3 147 my $class = $CALLER;
2c0cbef7 148 return subname 'Moose::override' => sub ($&) {
9bcfbab1 149 my ( $name, $method ) = @_;
150 $class->meta->add_override_method_modifier( $name => $method );
a3c7e2fe 151 };
152 },
153 inner => sub {
52c7c330 154 {
9bcfbab1 155 our %INNER_SLOT;
156 no strict 'refs';
157 $INNER_SLOT{$CALLER} = \*{"${CALLER}::inner"};
52c7c330 158 }
9bcfbab1 159 return subname 'Moose::inner' => sub { };
a3c7e2fe 160 },
161 augment => sub {
be33e4f3 162 my $class = $CALLER;
2c0cbef7 163 return subname 'Moose::augment' => sub (@&) {
9bcfbab1 164 my ( $name, $method ) = @_;
165 $class->meta->add_augment_method_modifier( $name => $method );
a3c7e2fe 166 };
167 },
2a5e59d0 168 make_immutable => sub {
169 my $class = $CALLER;
170 return subname 'Moose::make_immutable' => sub {
c2922d69 171 warn "The make_immutable keyword has been deprecated, " .
172 "please go back to __PACKAGE__->meta->make_immutable\n";
e902b1a5 173 $class->meta->make_immutable(@_);
2a5e59d0 174 };
175 },
a3c7e2fe 176 confess => sub {
177 return \&Carp::confess;
178 },
179 blessed => sub {
180 return \&Scalar::Util::blessed;
66bcefc1 181 },
a3c7e2fe 182 );
3d544ed5 183
9bcfbab1 184 my $exporter = Sub::Exporter::build_exporter(
185 {
186 exports => \%exports,
187 groups => { default => [':all'] }
a3c7e2fe 188 }
9bcfbab1 189 );
190
c92c1205 191 # 1 extra level because it's called by import so there's a layer of indirection
192 sub _get_caller{
193 my $offset = 1;
26fbace8 194 return
c92c1205 195 ref $_[1] && defined $_[1]->{into}
196 ? $_[1]->{into}
197 : ref $_[1] && defined $_[1]->{into_level}
198 ? caller($offset + $_[1]->{into_level})
199 : caller($offset);
200 }
5bee491d 201
202 sub import {
c92c1205 203 $CALLER = _get_caller(@_);
26fbace8 204
86dd5d11 205 # this works because both pragmas set $^H (see perldoc perlvar)
206 # which affects the current compilation - i.e. the file who use'd
207 # us - which is why we don't need to do anything special to make
208 # it affect that file rather than this one (which is already compiled)
209
c235cd98 210 strict->import;
9bcfbab1 211 warnings->import;
a3c7e2fe 212
213 # we should never export to main
214 return if $CALLER eq 'main';
9bcfbab1 215
216 init_meta( $CALLER, 'Moose::Object' );
217
a3c7e2fe 218 goto $exporter;
fcb7afc2 219 }
9bcfbab1 220
31f8ec72 221 sub unimport {
9bcfbab1 222 no strict 'refs';
c92c1205 223 my $class = _get_caller(@_);
9bcfbab1 224
31f8ec72 225 # loop through the exports ...
9bcfbab1 226 foreach my $name ( keys %exports ) {
227
31f8ec72 228 # if we find one ...
9bcfbab1 229 if ( defined &{ $class . '::' . $name } ) {
230 my $keyword = \&{ $class . '::' . $name };
231
31f8ec72 232 # make sure it is from Moose
53dd42d8 233 my ($pkg_name) = Class::MOP::get_code_info($keyword);
31f8ec72 234 next if $@;
235 next if $pkg_name ne 'Moose';
9bcfbab1 236
31f8ec72 237 # and if it is from Moose then undef the slot
9bcfbab1 238 delete ${ $class . '::' }{$name};
31f8ec72 239 }
240 }
241 }
9bcfbab1 242
fcd84ca9 243}
244
8ecb1fa0 245## make 'em all immutable
246
247$_->meta->make_immutable(
248 inline_constructor => 0,
77a18c28 249 inline_accessors => 1, # these are Class::MOP accessors, so they need inlining
9bcfbab1 250 )
251 for (
8ecb1fa0 252 'Moose::Meta::Attribute',
253 'Moose::Meta::Class',
254 'Moose::Meta::Instance',
255
256 'Moose::Meta::TypeConstraint',
257 'Moose::Meta::TypeConstraint::Union',
0fbd4b0a 258 'Moose::Meta::TypeConstraint::Parameterized',
8ecb1fa0 259 'Moose::Meta::TypeCoercion',
260
261 'Moose::Meta::Method',
262 'Moose::Meta::Method::Accessor',
263 'Moose::Meta::Method::Constructor',
9bcfbab1 264 'Moose::Meta::Method::Destructor',
8ecb1fa0 265 'Moose::Meta::Method::Overriden',
d67145ed 266
267 'Moose::Meta::Role',
9bcfbab1 268 'Moose::Meta::Role::Method',
269 'Moose::Meta::Role::Method::Required',
270 );
8ecb1fa0 271
fcd84ca9 2721;
273
274__END__
275
276=pod
277
278=head1 NAME
279
8bdc7f13 280Moose - A postmodern object system for Perl 5
fcd84ca9 281
282=head1 SYNOPSIS
e522431d 283
284 package Point;
1cd45431 285 use Moose; # automatically turns on strict and warnings
26fbace8 286
43d599e5 287 has 'x' => (is => 'rw', isa => 'Int');
288 has 'y' => (is => 'rw', isa => 'Int');
26fbace8 289
e522431d 290 sub clear {
291 my $self = shift;
292 $self->x(0);
26fbace8 293 $self->y(0);
e522431d 294 }
26fbace8 295
e522431d 296 package Point3D;
297 use Moose;
26fbace8 298
e522431d 299 extends 'Point';
26fbace8 300
43d599e5 301 has 'z' => (is => 'rw', isa => 'Int');
26fbace8 302
e522431d 303 after 'clear' => sub {
304 my $self = shift;
43d599e5 305 $self->z(0);
26fbace8 306 };
2c0cbef7 307
fcd84ca9 308=head1 DESCRIPTION
309
26fbace8 310Moose is an extension of the Perl 5 object system.
e522431d 311
312=head2 Another object system!?!?
fcd84ca9 313
26fbace8 314Yes, I know there has been an explosion recently of new ways to
68efb014 315build object's in Perl 5, most of them based on inside-out objects
26fbace8 316and other such things. Moose is different because it is not a new
317object system for Perl 5, but instead an extension of the existing
e522431d 318object system.
3c7278fb 319
26fbace8 320Moose is built on top of L<Class::MOP>, which is a metaclass system
321for Perl 5. This means that Moose not only makes building normal
322Perl 5 objects better, but it also provides the power of metaclass
505c6fac 323programming.
e522431d 324
734d1752 325=head2 Is this for real? Or is this just an experiment?
e522431d 326
2c0cbef7 327Moose is I<based> on the prototypes and experiments I did for the Perl 6
26fbace8 328meta-model. However, Moose is B<NOT> an experiment/prototype; it is for B<real>.
734d1752 329
26fbace8 330=head2 Is this ready for use in production?
d44714be 331
26fbace8 332Yes, I believe that it is.
734d1752 333
26fbace8 334Moose has been used successfully in production environemnts by several people
335and companies (including the one I work for). There are Moose applications
8bdc7f13 336which have been in production with little or no issue now for well over a year.
26fbace8 337I consider it highly stable and we are commited to keeping it stable.
e522431d 338
26fbace8 339Of course, in the end, you need to make this call yourself. If you have
340any questions or concerns, please feel free to email me, or even the list
d44714be 341or just stop by #moose and ask away.
342
43d599e5 343=head2 Is Moose just Perl 6 in Perl 5?
e522431d 344
68efb014 345No. While Moose is very much inspired by Perl 6, it is not itself Perl 6.
1cd45431 346Instead, it is an OO system for Perl 5. I built Moose because I was tired of
68efb014 347writing the same old boring Perl 5 OO code, and drooling over Perl 6 OO. So
348instead of switching to Ruby, I wrote Moose :)
3c7278fb 349
8bdc7f13 350=head2 Wait, I<post> modern, I thought it was just I<modern>?
351
352So I was reading Larry Wall's talk from the 1999 Linux World entitled
353"Perl, the first postmodern computer language" in which he talks about how
354he picked the features for Perl because he thought they were cool and he
355threw out the ones that he thought sucked. This got me thinking about how
356we have done the same thing in Moose. For Moose, we have "borrowed" features
357from Perl 6, CLOS (LISP), Smalltalk, Java, BETA, OCaml, Ruby and more, and
358the bits we didn't like (cause they sucked) we tossed aside. So for this
359reason (and a few others) I have re-dubbed Moose a I<postmodern> object system.
360
361Nuff Said.
362
28669f89 363=head2 Moose Extensions
364
365The L<MooseX::> namespace is the official place to find Moose extensions.
0b26305c 366There are a number of these modules out on CPAN right now the best way to
367find them is to search for MooseX:: on search.cpan.org.
28669f89 368
6ba6d68c 369=head1 BUILDING CLASSES WITH MOOSE
370
68efb014 371Moose makes every attempt to provide as much convenience as possible during
372class construction/definition, but still stay out of your way if you want it
373to. Here are a few items to note when building classes with Moose.
6ba6d68c 374
26fbace8 375Unless specified with C<extends>, any class which uses Moose will
6ba6d68c 376inherit from L<Moose::Object>.
377
1cd45431 378Moose will also manage all attributes (including inherited ones) that are
379defined with C<has>. And (assuming you call C<new>, which is inherited from
380L<Moose::Object>) this includes properly initializing all instance slots,
381setting defaults where appropriate, and performing any type constraint checking
382or coercion.
6ba6d68c 383
004222dc 384=head1 PROVIDED METHODS
6ba6d68c 385
004222dc 386Moose provides a number of methods to all your classes, mostly through the
387inheritance of L<Moose::Object>. There is however, one exception.
6ba6d68c 388
389=over 4
390
391=item B<meta>
392
393This is a method which provides access to the current class's metaclass.
394
004222dc 395=back
396
397=head1 EXPORTED FUNCTIONS
398
399Moose will export a number of functions into the class's namespace which
400may then be used to set up the class. These functions all work directly
401on the current class.
402
403=over 4
404
6ba6d68c 405=item B<extends (@superclasses)>
406
407This function will set the superclass(es) for the current class.
408
26fbace8 409This approach is recommended instead of C<use base>, because C<use base>
410actually C<push>es onto the class's C<@ISA>, whereas C<extends> will
411replace it. This is important to ensure that classes which do not have
68efb014 412superclasses still properly inherit from L<Moose::Object>.
6ba6d68c 413
43d599e5 414=item B<with (@roles)>
e9ec68d6 415
004222dc 416This will apply a given set of C<@roles> to the local class.
e9ec68d6 417
cd7eeaf5 418=item B<has $name =E<gt> %options>
6ba6d68c 419
26fbace8 420This will install an attribute of a given C<$name> into the current class.
421The C<%options> are the same as those provided by
422L<Class::MOP::Attribute>, in addition to the list below which are provided
43d599e5 423by Moose (L<Moose::Meta::Attribute> to be more specific):
6ba6d68c 424
425=over 4
426
076c81ed 427=item I<is =E<gt> 'rw'|'ro'>
6ba6d68c 428
26fbace8 429The I<is> option accepts either I<rw> (for read/write) or I<ro> (for read
430only). These will create either a read/write accessor or a read-only
6ba6d68c 431accessor respectively, using the same name as the C<$name> of the attribute.
432
1cd45431 433If you need more control over how your accessors are named, you can use the
434I<reader>, I<writer> and I<accessor> options inherited from
004222dc 435L<Class::MOP::Attribute>, however if you use those, you won't need the I<is>
436option.
6ba6d68c 437
076c81ed 438=item I<isa =E<gt> $type_name>
6ba6d68c 439
26fbace8 440The I<isa> option uses Moose's type constraint facilities to set up runtime
441type checking for this attribute. Moose will perform the checks during class
442construction, and within any accessors. The C<$type_name> argument must be a
443string. The string may be either a class name or a type defined using
9cca2e9e 444Moose's type definition features. (Refer to L<Moose::Util::TypeConstraints>
c2a69ef1 445for information on how to define a new type, and how to retrieve type meta-data).
6ba6d68c 446
daea75c9 447=item I<coerce =E<gt> (1|0)>
448
26fbace8 449This will attempt to use coercion with the supplied type constraint to change
450the value passed into any accessors or constructors. You B<must> have supplied
daea75c9 451a type constraint in order for this to work. See L<Moose::Cookbook::Recipe5>
1cd45431 452for an example.
daea75c9 453
454=item I<does =E<gt> $role_name>
455
26fbace8 456This will accept the name of a role which the value stored in this attribute
daea75c9 457is expected to have consumed.
458
459=item I<required =E<gt> (1|0)>
460
26fbace8 461This marks the attribute as being required. This means a I<defined> value must be
462supplied during class construction, and the attribute may never be set to
463C<undef> with an accessor.
daea75c9 464
465=item I<weak_ref =E<gt> (1|0)>
466
68efb014 467This will tell the class to store the value of this attribute as a weakened
468reference. If an attribute is a weakened reference, it B<cannot> also be
469coerced.
daea75c9 470
471=item I<lazy =E<gt> (1|0)>
472
26fbace8 473This will tell the class to not create this slot until absolutely necessary.
daea75c9 474If an attribute is marked as lazy it B<must> have a default supplied.
475
9e93dd19 476=item I<auto_deref =E<gt> (1|0)>
477
26fbace8 478This tells the accessor whether to automatically dereference the value returned.
1cd45431 479This is only legal if your C<isa> option is either C<ArrayRef> or C<HashRef>.
9e93dd19 480
daea75c9 481=item I<trigger =E<gt> $code>
482
1cd45431 483The I<trigger> option is a CODE reference which will be called after the value of
484the attribute is set. The CODE ref will be passed the instance itself, the
daea75c9 485updated value and the attribute meta-object (this is for more advanced fiddling
1cd45431 486and can typically be ignored). You B<cannot> have a trigger on a read-only
487attribute.
daea75c9 488
c84f324f 489=item I<handles =E<gt> ARRAY | HASH | REGEXP | ROLE | CODE>
2c0cbef7 490
26fbace8 491The I<handles> option provides Moose classes with automated delegation features.
492This is a pretty complex and powerful option. It accepts many different option
493formats, each with its own benefits and drawbacks.
38e3283b 494
1cd45431 495B<NOTE:> The class being delegated to does not need to be a Moose based class,
496which is why this feature is especially useful when wrapping non-Moose classes.
38e3283b 497
1cd45431 498All I<handles> option formats share the following traits:
38e3283b 499
1cd45431 500You cannot override a locally defined method with a delegated method; an
501exception will be thrown if you try. That is to say, if you define C<foo> in
502your class, you cannot override it with a delegated C<foo>. This is almost never
503something you would want to do, and if it is, you should do it by hand and not
504use Moose.
38e3283b 505
1cd45431 506You cannot override any of the methods found in Moose::Object, or the C<BUILD>
507and C<DEMOLISH> methods. These will not throw an exception, but will silently
508move on to the next method in the list. My reasoning for this is that you would
509almost never want to do this, since it usually breaks your class. As with
510overriding locally defined methods, if you do want to do this, you should do it
511manually, not with Moose.
38e3283b 512
f3c4e20e 513You do not I<need> to have a reader (or accessor) for the attribute in order
514to delegate to it. Moose will create a means of accessing the value for you,
515however this will be several times B<less> efficient then if you had given
516the attribute a reader (or accessor) to use.
517
38e3283b 518Below is the documentation for each option format:
519
520=over 4
521
522=item C<ARRAY>
523
26fbace8 524This is the most common usage for I<handles>. You basically pass a list of
525method names to be delegated, and Moose will install a delegation method
1cd45431 526for each one.
38e3283b 527
528=item C<HASH>
529
26fbace8 530This is the second most common usage for I<handles>. Instead of a list of
531method names, you pass a HASH ref where each key is the method name you
532want installed locally, and its value is the name of the original method
533in the class being delegated to.
fd595040 534
26fbace8 535This can be very useful for recursive classes like trees. Here is a
fd595040 536quick example (soon to be expanded into a Moose::Cookbook::Recipe):
38e3283b 537
1cd45431 538 package Tree;
38e3283b 539 use Moose;
26fbace8 540
38e3283b 541 has 'node' => (is => 'rw', isa => 'Any');
26fbace8 542
38e3283b 543 has 'children' => (
544 is => 'ro',
545 isa => 'ArrayRef',
546 default => sub { [] }
547 );
26fbace8 548
38e3283b 549 has 'parent' => (
550 is => 'rw',
551 isa => 'Tree',
a4e516f6 552 weak_ref => 1,
38e3283b 553 handles => {
554 parent_node => 'node',
26fbace8 555 siblings => 'children',
38e3283b 556 }
557 );
558
1cd45431 559In this example, the Tree package gets C<parent_node> and C<siblings> methods,
560which delegate to the C<node> and C<children> methods (respectively) of the Tree
26fbace8 561instance stored in the C<parent> slot.
38e3283b 562
563=item C<REGEXP>
564
26fbace8 565The regexp option works very similar to the ARRAY option, except that it builds
566the list of methods for you. It starts by collecting all possible methods of the
567class being delegated to, then filters that list using the regexp supplied here.
38e3283b 568
26fbace8 569B<NOTE:> An I<isa> option is required when using the regexp option format. This
570is so that we can determine (at compile time) the method list from the class.
38e3283b 571Without an I<isa> this is just not possible.
572
c84f324f 573=item C<ROLE>
574
26fbace8 575With the role option, you specify the name of a role whose "interface" then
576becomes the list of methods to handle. The "interface" can be defined as; the
577methods of the role and any required methods of the role. It should be noted
578that this does B<not> include any method modifiers or generated attribute
c84f324f 579methods (which is consistent with role composition).
580
38e3283b 581=item C<CODE>
582
1cd45431 583This is the option to use when you really want to do something funky. You should
584only use it if you really know what you are doing, as it involves manual
585metaclass twiddling.
38e3283b 586
1cd45431 587This takes a code reference, which should expect two arguments. The first is the
588attribute meta-object this I<handles> is attached to. The second is the
589metaclass of the class being delegated to. It expects you to return a hash (not
26fbace8 590a HASH ref) of the methods you want mapped.
38e3283b 591
592=back
2c0cbef7 593
004222dc 594=item I<metaclass =E<gt> $metaclass_name>
595
596This tells the class to use a custom attribute metaclass for this particular
597attribute. Custom attribute metaclasses are useful for extending the
598capabilities of the I<has> keyword: they are the simplest way to extend the MOP,
599but they are still a fairly advanced topic and too much to cover here, see
600L<Moose::Cookbook::Recipe11> for more information.
601
602The default behavior here is to just load C<$metaclass_name>; however, we also
603have a way to alias to a shorter name. This will first look to see if
604B<Moose::Meta::Attribute::Custom::$metaclass_name> exists. If it does, Moose
605will then check to see if that has the method C<register_implementation>, which
606should return the actual name of the custom attribute metaclass. If there is no
607C<register_implementation> method, it will fall back to using
608B<Moose::Meta::Attribute::Custom::$metaclass_name> as the metaclass name.
609
610=item I<traits =E<gt> [ @role_names ]>
611
612This tells Moose to take the list of C<@role_names> and apply them to the
613attribute meta-object. This is very similar to the I<metaclass> option, but
614allows you to use more than one extension at a time. This too is an advanced
615topic, we don't yet have a cookbook for it though.
616
617As with I<metaclass>, the default behavior is to just load C<$role_name>; however,
618we also have a way to alias to a shorter name. This will first look to see if
619B<Moose::Meta::Attribute::Custom::Trait::$role_name> exists. If it does, Moose
620will then check to see if that has the method C<register_implementation>, which
621should return the actual name of the custom attribute trait. If there is no
622C<register_implementation> method, it will fall back to using
623B<Moose::Meta::Attribute::Custom::Trait::$metaclass_name> as the trait name.
624
6ba6d68c 625=back
626
cd7eeaf5 627=item B<has +$name =E<gt> %options>
628
26fbace8 629This is variation on the normal attibute creator C<has> which allows you to
8d62bf6d 630clone and extend an attribute from a superclass or from a role. Here is an
631example of the superclass usage:
cd7eeaf5 632
633 package Foo;
634 use Moose;
26fbace8 635
cd7eeaf5 636 has 'message' => (
26fbace8 637 is => 'rw',
cd7eeaf5 638 isa => 'Str',
639 default => 'Hello, I am a Foo'
640 );
26fbace8 641
cd7eeaf5 642 package My::Foo;
643 use Moose;
26fbace8 644
cd7eeaf5 645 extends 'Foo';
26fbace8 646
cd7eeaf5 647 has '+message' => (default => 'Hello I am My::Foo');
648
1cd45431 649What is happening here is that B<My::Foo> is cloning the C<message> attribute
650from its parent class B<Foo>, retaining the C<is =E<gt> 'rw'> and C<isa =E<gt>
651'Str'> characteristics, but changing the value in C<default>.
cd7eeaf5 652
8d62bf6d 653Here is another example, but within the context of a role:
654
655 package Foo::Role;
656 use Moose::Role;
657
658 has 'message' => (
659 is => 'rw',
660 isa => 'Str',
661 default => 'Hello, I am a Foo'
662 );
663
664 package My::Foo;
665 use Moose;
666
667 with 'Foo::Role';
668
669 has '+message' => (default => 'Hello I am My::Foo');
670
671In this case, we are basically taking the attribute which the role supplied
4032c9bb 672and altering it within the bounds of this feature.
8d62bf6d 673
4032c9bb 674Aside from where the attributes come from (one from superclass, the other
675from a role), this feature works exactly the same. This feature is restricted
676somewhat, so as to try and force at least I<some> sanity into it. You are only
677allowed to change the following attributes:
cd7eeaf5 678
679=over 4
680
26fbace8 681=item I<default>
cd7eeaf5 682
683Change the default value of an attribute.
684
26fbace8 685=item I<coerce>
cd7eeaf5 686
687Change whether the attribute attempts to coerce a value passed to it.
688
26fbace8 689=item I<required>
cd7eeaf5 690
691Change if the attribute is required to have a value.
692
693=item I<documentation>
694
695Change the documentation string associated with the attribute.
696
83cc9094 697=item I<lazy>
698
699Change if the attribute lazily initializes the slot.
700
cd7eeaf5 701=item I<isa>
702
1cd45431 703You I<are> allowed to change the type, B<if and only if> the new type is a
704subtype of the old type.
cd7eeaf5 705
83cc9094 706=item I<handles>
707
26fbace8 708You are allowed to B<add> a new C<handles> definition, but you are B<not>
709allowed to I<change> one.
83cc9094 710
8d62bf6d 711=item I<builder>
712
713You are allowed to B<add> a new C<builder> definition, but you are B<not>
714allowed to I<change> one.
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
004222dc 747the L<Moose::Cookbook::Recipe7>.
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
004222dc 753C<augment> work is best described in the L<Moose::Cookbook::Recipe7>.
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
1cd45431 768=head1 UNIMPORTING FUNCTIONS
31f8ec72 769
770=head2 B<unimport>
771
1cd45431 772Moose offers a way to remove the keywords it exports, through the C<unimport>
31f8ec72 773method. You simply have to say C<no Moose> at the bottom of your code for this
774to work. Here is an example:
775
776 package Person;
777 use Moose;
778
779 has 'first_name' => (is => 'rw', isa => 'Str');
780 has 'last_name' => (is => 'rw', isa => 'Str');
26fbace8 781
782 sub full_name {
31f8ec72 783 my $self = shift;
26fbace8 784 $self->first_name . ' ' . $self->last_name
31f8ec72 785 }
26fbace8 786
787 no Moose; # keywords are removed from the Person package
31f8ec72 788
9bcfbab1 789=head1 EXTENDING AND EMBEDDING MOOSE
790
26fbace8 791Moose also offers some options for extending or embedding it into your own
9bcfbab1 792framework. The basic premise is to have something that sets up your class'
26fbace8 793metaclass and export the moose declarators (C<has>, C<with>, C<extends>,...).
9bcfbab1 794Here is an example:
795
796 package MyFramework;
797 use Moose;
26fbace8 798
9bcfbab1 799 sub import {
800 my $CALLER = caller();
801
802 strict->import;
803 warnings->import;
804
805 # we should never export to main
806 return if $CALLER eq 'main';
807 Moose::init_meta( $CALLER, 'MyFramework::Base' );
808 Moose->import({into => $CALLER});
809
810 # Do my custom framework stuff
26fbace8 811
9bcfbab1 812 return 1;
813 }
26fbace8 814
9bcfbab1 815=head2 B<import>
816
77a18c28 817Moose's C<import> method supports the L<Sub::Exporter> form of C<{into =E<gt> $pkg}>
9bcfbab1 818and C<{into_level =E<gt> 1}>
819
820=head2 B<init_meta ($class, $baseclass, $metaclass)>
821
26fbace8 822Moose does some boot strapping: it creates a metaclass object for your class,
823and then injects a C<meta> accessor into your class to retrieve it. Then it
824sets your baseclass to Moose::Object or the value you pass in unless you already
825have one. This is all done via C<init_meta> which takes the name of your class
2bbba362 826and optionally a baseclass and a metaclass as arguments.
26fbace8 827
05d9eaf6 828=head1 CAVEATS
829
830=over 4
831
832=item *
833
1cd45431 834It should be noted that C<super> and C<inner> B<cannot> be used in the same
835method. However, they may be combined within the same class hierarchy; see
836F<t/014_override_augment_inner_super.t> for an example.
05d9eaf6 837
26fbace8 838The reason for this is that C<super> is only valid within a method
839with the C<override> modifier, and C<inner> will never be valid within an
840C<override> method. In fact, C<augment> will skip over any C<override> methods
68efb014 841when searching for its appropriate C<inner>.
05d9eaf6 842
1cd45431 843This might seem like a restriction, but I am of the opinion that keeping these
844two features separate (yet interoperable) actually makes them easy to use, since
845their behavior is then easier to predict. Time will tell whether I am right or
c84f324f 846not (UPDATE: so far so good).
05d9eaf6 847
004222dc 848=item *
849
850It is important to note that we currently have no simple way of combining
851multiple extended versions of Moose (see L<EXTENDING AND EMBEDDING MOOSE> above),
852and that in many cases they will conflict with one another. We are working on
853developing a way around this issue, but in the meantime, you have been warned.
854
05d9eaf6 855=back
856
5569c072 857=head1 ACKNOWLEDGEMENTS
858
859=over 4
860
54c189df 861=item I blame Sam Vilain for introducing me to the insanity that is meta-models.
5569c072 862
54c189df 863=item I blame Audrey Tang for then encouraging my meta-model habit in #perl6.
5569c072 864
26fbace8 865=item Without Yuval "nothingmuch" Kogman this module would not be possible,
54c189df 866and it certainly wouldn't have this name ;P
5569c072 867
26fbace8 868=item The basis of the TypeContraints module was Rob Kinyon's idea
5569c072 869originally, I just ran with it.
870
638585e1 871=item Thanks to mst & chansen and the whole #moose posse for all the
c84f324f 872early ideas/feature-requests/encouragement/bug-finding.
d46a48f3 873
68efb014 874=item Thanks to David "Theory" Wheeler for meta-discussions and spelling fixes.
875
5569c072 876=back
877
e90c03d0 878=head1 SEE ALSO
879
880=over 4
881
c84f324f 882=item L<http://www.iinteractive.com/moose>
883
884This is the official web home of Moose, it contains links to our public SVN repo
26fbace8 885as well as links to a number of talks and articles on Moose and Moose related
886technologies.
c84f324f 887
6ba6d68c 888=item L<Class::MOP> documentation
889
890=item The #moose channel on irc.perl.org
891
e67a0fca 892=item The Moose mailing list - moose@perl.org
893
c84f324f 894=item Moose stats on ohloh.net - L<http://www.ohloh.net/projects/5788>
895
28669f89 896=item Several Moose extension modules in the L<MooseX::> namespace.
897
c84f324f 898=back
899
004222dc 900=head2 Books
901
902=over 4
903
904=item The Art of the MetaObject Protocol
905
906I mention this in the L<Class::MOP> docs too, this book was critical in
907the development of both modules and is highly recommended.
908
909=back
910
26fbace8 911=head2 Papers
c84f324f 912
913=over 4
e90c03d0 914
159da176 915=item L<http://www.cs.utah.edu/plt/publications/oopsla04-gff.pdf>
916
26fbace8 917This paper (suggested by lbr on #moose) was what lead to the implementation
918of the C<super>/C<override> and C<inner>/C<augment> features. If you really
1cd45431 919want to understand them, I suggest you read this.
159da176 920
e90c03d0 921=back
922
fcd84ca9 923=head1 BUGS
924
26fbace8 925All complex software has bugs lurking in it, and this module is no
fcd84ca9 926exception. If you find a bug please either email me, or add the bug
927to cpan-RT.
928
fcd84ca9 929=head1 AUTHOR
930
931Stevan Little E<lt>stevan@iinteractive.comE<gt>
932
9af1d28b 933B<with contributions from:>
db1ab48d 934
9af1d28b 935Aankhen
936
937Adam (Alias) Kennedy
938
939Anders (Debolaz) Nor Berle
940
5868294f 941Nathan (kolibre) Gray
942
9af1d28b 943Christian (chansen) Hansen
944
e7f8d0c2 945Hans Dieter (confound) Pearcey
946
9af1d28b 947Eric (ewilhelm) Wilhelm
948
949Guillermo (groditi) Roditi
950
951Jess (castaway) Robinson
952
953Matt (mst) Trout
954
955Robert (phaylon) Sedlacek
956
957Robert (rlb3) Boone
958
959Scott (konobi) McWhirter
960
f44ae52f 961Shlomi (rindolf) Fish
962
9af1d28b 963Yuval (nothingmuch) Kogman
964
cbe25729 965Chris (perigrin) Prather
966
e46f5cc2 967Jonathan (jrockway) Rockway
968
3ccdc84a 969Piotr (dexter) Roszatycki
970
26fbace8 971Sam (mugwump) Vilain
f1917f58 972
ac211120 973Shawn (sartak) Moore
974
9af1d28b 975... and many other #moose folks
98aae381 976
fcd84ca9 977=head1 COPYRIGHT AND LICENSE
978
778db3ac 979Copyright 2006-2008 by Infinity Interactive, Inc.
fcd84ca9 980
981L<http://www.iinteractive.com>
982
983This library is free software; you can redistribute it and/or modify
26fbace8 984it under the same terms as Perl itself.
fcd84ca9 985
ddd0ec20 986=cut