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