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