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