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