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