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