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