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