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