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