Merge 'Moose-moosex_compile_support' into 'trunk'
[gitmo/Moose.git] / lib / Moose.pm
CommitLineData
fcd84ca9 1
2package Moose;
3
4use strict;
5use warnings;
6
32dd4a95 7our $VERSION = '0.34';
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
89a173f8 16use Class::MOP 0.49;
ef1d5f4b 17
c0e30cf5 18use Moose::Meta::Class;
7415b2cb 19use Moose::Meta::TypeConstraint;
7c13858b 20use Moose::Meta::TypeCoercion;
78cd1d3b 21use Moose::Meta::Attribute;
ddd0ec20 22use Moose::Meta::Instance;
c0e30cf5 23
d67145ed 24use Moose::Meta::Role;
25
fcd84ca9 26use Moose::Object;
7415b2cb 27use Moose::Util::TypeConstraints;
a15dff8d 28
a3c7e2fe 29{
be33e4f3 30 my $CALLER;
9bcfbab1 31
32 sub init_meta {
33 my ( $class, $base_class, $metaclass ) = @_;
72bbc189 34 $base_class = $class unless defined $base_class;
26fbace8 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
9bcfbab1 42 subtype $class => as 'Object' => where { $_->isa($class) } =>
97e11ef5 43 optimize_as { blessed( $_[0] ) && $_[0]->isa($class) }
a3c7e2fe 44 unless find_type_constraint($class);
45
46 my $meta;
9bcfbab1 47 if ( $class->can('meta') ) {
fcec2383 48 # NOTE:
9bcfbab1 49 # this is the case where the metaclass pragma
50 # was used before the 'use Moose' statement to
fcec2383 51 # override a specific class
a3c7e2fe 52 $meta = $class->meta();
9bcfbab1 53 ( blessed($meta) && $meta->isa('Moose::Meta::Class') )
1edfdf1c 54 || confess "You already have a &meta function, but it does not return a Moose::Meta::Class";
a3c7e2fe 55 }
56 else {
fcec2383 57 # NOTE:
9bcfbab1 58 # this is broken currently, we actually need
59 # to allow the possiblity of an inherited
60 # meta, which will not be visible until the
61 # user 'extends' first. This needs to have
62 # more intelligence to it
63 $meta = $metaclass->initialize($class);
64 $meta->add_method(
65 'meta' => sub {
66
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();
a3c7e2fe 76 }
77
78 my %exports = (
79 extends => sub {
be33e4f3 80 my $class = $CALLER;
68117c45 81 return subname 'Moose::extends' => sub (@) {
82 confess "Must derive at least one class" unless @_;
1eaed09d 83 Class::MOP::load_class($_) for @_;
9bcfbab1 84
85 # this checks the metaclass to make sure
86 # it is correct, sometimes it can get out
1341f10c 87 # of sync when the classes are being built
88 my $meta = $class->meta->_fix_metaclass_incompatability(@_);
be33e4f3 89 $meta->superclasses(@_);
a3c7e2fe 90 };
91 },
92 with => sub {
be33e4f3 93 my $class = $CALLER;
68117c45 94 return subname 'Moose::with' => sub (@) {
c4538447 95 my (@args) = @_;
96 confess "Must specify at least one role" unless @args;
97
98 my $roles = Data::OptList::mkopt(\@args);
99
100 #use Data::Dumper;
101 #warn Dumper $roles;
102
103 Class::MOP::load_class($_->[0]) for @$roles;
104
105 ($_->[0]->can('meta') && $_->[0]->meta->isa('Moose::Meta::Role'))
106 || confess "You can only consume roles, " . $_->[0] . " is not a Moose role"
107 foreach @$roles;
108
109 my $meta = $class->meta;
110
111 if (scalar @$roles == 1) {
112 my ($role, $params) = @{$roles->[0]};
113 $role->meta->apply($meta, (defined $params ? %$params : ()));
114 }
115 else {
116 Moose::Meta::Role->combine(
117 map { $_->[0]->meta } @$roles
118 )->apply($meta);
119 }
120
121 #$class->meta->_apply_all_roles(@roles);
a3c7e2fe 122 };
123 },
124 has => sub {
be33e4f3 125 my $class = $CALLER;
2c0cbef7 126 return subname 'Moose::has' => sub ($;%) {
9bcfbab1 127 my ( $name, %options ) = @_;
128 my $attrs = ( ref($name) eq 'ARRAY' ) ? $name : [ ($name) ];
129 $class->meta->_process_attribute( $_, %options ) for @$attrs;
a3c7e2fe 130 };
131 },
132 before => sub {
be33e4f3 133 my $class = $CALLER;
2c0cbef7 134 return subname 'Moose::before' => sub (@&) {
a3c7e2fe 135 my $code = pop @_;
be33e4f3 136 my $meta = $class->meta;
9bcfbab1 137 $meta->add_before_method_modifier( $_, $code ) for @_;
a3c7e2fe 138 };
139 },
140 after => sub {
be33e4f3 141 my $class = $CALLER;
2c0cbef7 142 return subname 'Moose::after' => sub (@&) {
a3c7e2fe 143 my $code = pop @_;
be33e4f3 144 my $meta = $class->meta;
9bcfbab1 145 $meta->add_after_method_modifier( $_, $code ) for @_;
a3c7e2fe 146 };
147 },
148 around => sub {
9bcfbab1 149 my $class = $CALLER;
2c0cbef7 150 return subname 'Moose::around' => sub (@&) {
a3c7e2fe 151 my $code = pop @_;
be33e4f3 152 my $meta = $class->meta;
9bcfbab1 153 $meta->add_around_method_modifier( $_, $code ) for @_;
a3c7e2fe 154 };
155 },
156 super => sub {
52c7c330 157 {
9bcfbab1 158 our %SUPER_SLOT;
159 no strict 'refs';
160 $SUPER_SLOT{$CALLER} = \*{"${CALLER}::super"};
52c7c330 161 }
9bcfbab1 162 return subname 'Moose::super' => sub { };
a3c7e2fe 163 },
164 override => sub {
be33e4f3 165 my $class = $CALLER;
2c0cbef7 166 return subname 'Moose::override' => sub ($&) {
9bcfbab1 167 my ( $name, $method ) = @_;
168 $class->meta->add_override_method_modifier( $name => $method );
a3c7e2fe 169 };
170 },
171 inner => sub {
52c7c330 172 {
9bcfbab1 173 our %INNER_SLOT;
174 no strict 'refs';
175 $INNER_SLOT{$CALLER} = \*{"${CALLER}::inner"};
52c7c330 176 }
9bcfbab1 177 return subname 'Moose::inner' => sub { };
a3c7e2fe 178 },
179 augment => sub {
be33e4f3 180 my $class = $CALLER;
2c0cbef7 181 return subname 'Moose::augment' => sub (@&) {
9bcfbab1 182 my ( $name, $method ) = @_;
183 $class->meta->add_augment_method_modifier( $name => $method );
a3c7e2fe 184 };
185 },
186 confess => sub {
187 return \&Carp::confess;
188 },
189 blessed => sub {
190 return \&Scalar::Util::blessed;
66bcefc1 191 },
a3c7e2fe 192 );
3d544ed5 193
9bcfbab1 194 my $exporter = Sub::Exporter::build_exporter(
195 {
196 exports => \%exports,
197 groups => { default => [':all'] }
a3c7e2fe 198 }
9bcfbab1 199 );
200
c92c1205 201 # 1 extra level because it's called by import so there's a layer of indirection
202 sub _get_caller{
203 my $offset = 1;
26fbace8 204 return
c92c1205 205 ref $_[1] && defined $_[1]->{into}
206 ? $_[1]->{into}
207 : ref $_[1] && defined $_[1]->{into_level}
208 ? caller($offset + $_[1]->{into_level})
209 : caller($offset);
210 }
5bee491d 211
212 sub import {
c92c1205 213 $CALLER = _get_caller(@_);
26fbace8 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
31f8ec72 285Moose - A complete modern 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
341which have been in production with little or no issue now for over a year.
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
28669f89 355=head2 Moose Extensions
356
357The L<MooseX::> namespace is the official place to find Moose extensions.
0b26305c 358There are a number of these modules out on CPAN right now the best way to
359find them is to search for MooseX:: on search.cpan.org.
28669f89 360
6ba6d68c 361=head1 BUILDING CLASSES WITH MOOSE
362
68efb014 363Moose makes every attempt to provide as much convenience as possible during
364class construction/definition, but still stay out of your way if you want it
365to. Here are a few items to note when building classes with Moose.
6ba6d68c 366
26fbace8 367Unless specified with C<extends>, any class which uses Moose will
6ba6d68c 368inherit from L<Moose::Object>.
369
1cd45431 370Moose will also manage all attributes (including inherited ones) that are
371defined with C<has>. And (assuming you call C<new>, which is inherited from
372L<Moose::Object>) this includes properly initializing all instance slots,
373setting defaults where appropriate, and performing any type constraint checking
374or coercion.
6ba6d68c 375
376=head1 EXPORTED FUNCTIONS
377
26fbace8 378Moose will export a number of functions into the class's namespace which
379may then be used to set up the class. These functions all work directly
6ba6d68c 380on the current class.
381
382=over 4
383
384=item B<meta>
385
386This is a method which provides access to the current class's metaclass.
387
388=item B<extends (@superclasses)>
389
390This function will set the superclass(es) for the current class.
391
26fbace8 392This approach is recommended instead of C<use base>, because C<use base>
393actually C<push>es onto the class's C<@ISA>, whereas C<extends> will
394replace it. This is important to ensure that classes which do not have
68efb014 395superclasses still properly inherit from L<Moose::Object>.
6ba6d68c 396
43d599e5 397=item B<with (@roles)>
e9ec68d6 398
26fbace8 399This will apply a given set of C<@roles> to the local class. Role support
68efb014 400is currently under heavy development; see L<Moose::Role> for more details.
e9ec68d6 401
cd7eeaf5 402=item B<has $name =E<gt> %options>
6ba6d68c 403
26fbace8 404This will install an attribute of a given C<$name> into the current class.
405The C<%options> are the same as those provided by
406L<Class::MOP::Attribute>, in addition to the list below which are provided
43d599e5 407by Moose (L<Moose::Meta::Attribute> to be more specific):
6ba6d68c 408
409=over 4
410
076c81ed 411=item I<is =E<gt> 'rw'|'ro'>
6ba6d68c 412
26fbace8 413The I<is> option accepts either I<rw> (for read/write) or I<ro> (for read
414only). These will create either a read/write accessor or a read-only
6ba6d68c 415accessor respectively, using the same name as the C<$name> of the attribute.
416
1cd45431 417If you need more control over how your accessors are named, you can use the
418I<reader>, I<writer> and I<accessor> options inherited from
419L<Class::MOP::Attribute>.
6ba6d68c 420
076c81ed 421=item I<isa =E<gt> $type_name>
6ba6d68c 422
26fbace8 423The I<isa> option uses Moose's type constraint facilities to set up runtime
424type checking for this attribute. Moose will perform the checks during class
425construction, and within any accessors. The C<$type_name> argument must be a
426string. The string may be either a class name or a type defined using
9cca2e9e 427Moose's type definition features. (Refer to L<Moose::Util::TypeConstraints>
c2a69ef1 428for information on how to define a new type, and how to retrieve type meta-data).
6ba6d68c 429
daea75c9 430=item I<coerce =E<gt> (1|0)>
431
26fbace8 432This will attempt to use coercion with the supplied type constraint to change
433the value passed into any accessors or constructors. You B<must> have supplied
daea75c9 434a type constraint in order for this to work. See L<Moose::Cookbook::Recipe5>
1cd45431 435for an example.
daea75c9 436
437=item I<does =E<gt> $role_name>
438
26fbace8 439This will accept the name of a role which the value stored in this attribute
daea75c9 440is expected to have consumed.
441
442=item I<required =E<gt> (1|0)>
443
26fbace8 444This marks the attribute as being required. This means a I<defined> value must be
445supplied during class construction, and the attribute may never be set to
446C<undef> with an accessor.
daea75c9 447
448=item I<weak_ref =E<gt> (1|0)>
449
68efb014 450This will tell the class to store the value of this attribute as a weakened
451reference. If an attribute is a weakened reference, it B<cannot> also be
452coerced.
daea75c9 453
454=item I<lazy =E<gt> (1|0)>
455
26fbace8 456This will tell the class to not create this slot until absolutely necessary.
daea75c9 457If an attribute is marked as lazy it B<must> have a default supplied.
458
9e93dd19 459=item I<auto_deref =E<gt> (1|0)>
460
26fbace8 461This tells the accessor whether to automatically dereference the value returned.
1cd45431 462This is only legal if your C<isa> option is either C<ArrayRef> or C<HashRef>.
9e93dd19 463
c1935ade 464=item I<metaclass =E<gt> $metaclass_name>
465
1cd45431 466This tells the class to use a custom attribute metaclass for this particular
467attribute. Custom attribute metaclasses are useful for extending the
468capabilities of the I<has> keyword: they are the simplest way to extend the MOP,
469but they are still a fairly advanced topic and too much to cover here. I will
470try and write a recipe on them soon.
471
472The default behavior here is to just load C<$metaclass_name>; however, we also
473have a way to alias to a shorter name. This will first look to see if
474B<Moose::Meta::Attribute::Custom::$metaclass_name> exists. If it does, Moose
32dd4a95 475will then check to see if that has the method C<register_implementation>, which
1cd45431 476should return the actual name of the custom attribute metaclass. If there is no
32dd4a95 477C<register_implementation> method, it will fall back to using
c1935ade 478B<Moose::Meta::Attribute::Custom::$metaclass_name> as the metaclass name.
479
daea75c9 480=item I<trigger =E<gt> $code>
481
1cd45431 482The I<trigger> option is a CODE reference which will be called after the value of
483the attribute is set. The CODE ref will be passed the instance itself, the
daea75c9 484updated value and the attribute meta-object (this is for more advanced fiddling
1cd45431 485and can typically be ignored). You B<cannot> have a trigger on a read-only
486attribute.
daea75c9 487
c84f324f 488=item I<handles =E<gt> ARRAY | HASH | REGEXP | ROLE | CODE>
2c0cbef7 489
26fbace8 490The I<handles> option provides Moose classes with automated delegation features.
491This is a pretty complex and powerful option. It accepts many different option
492formats, each with its own benefits and drawbacks.
38e3283b 493
1cd45431 494B<NOTE:> This feature is no longer experimental, but it may still have subtle
495bugs lurking in the deeper corners. If you think you have found a bug, you
26fbace8 496probably have, so please report it to me right away.
38e3283b 497
1cd45431 498B<NOTE:> The class being delegated to does not need to be a Moose based class,
499which is why this feature is especially useful when wrapping non-Moose classes.
38e3283b 500
1cd45431 501All I<handles> option formats share the following traits:
38e3283b 502
1cd45431 503You cannot override a locally defined method with a delegated method; an
504exception will be thrown if you try. That is to say, if you define C<foo> in
505your class, you cannot override it with a delegated C<foo>. This is almost never
506something you would want to do, and if it is, you should do it by hand and not
507use Moose.
38e3283b 508
1cd45431 509You cannot override any of the methods found in Moose::Object, or the C<BUILD>
510and C<DEMOLISH> methods. These will not throw an exception, but will silently
511move on to the next method in the list. My reasoning for this is that you would
512almost never want to do this, since it usually breaks your class. As with
513overriding locally defined methods, if you do want to do this, you should do it
514manually, not with Moose.
38e3283b 515
f3c4e20e 516You do not I<need> to have a reader (or accessor) for the attribute in order
517to delegate to it. Moose will create a means of accessing the value for you,
518however this will be several times B<less> efficient then if you had given
519the attribute a reader (or accessor) to use.
520
38e3283b 521Below is the documentation for each option format:
522
523=over 4
524
525=item C<ARRAY>
526
26fbace8 527This is the most common usage for I<handles>. You basically pass a list of
528method names to be delegated, and Moose will install a delegation method
1cd45431 529for each one.
38e3283b 530
531=item C<HASH>
532
26fbace8 533This is the second most common usage for I<handles>. Instead of a list of
534method names, you pass a HASH ref where each key is the method name you
535want installed locally, and its value is the name of the original method
536in the class being delegated to.
fd595040 537
26fbace8 538This can be very useful for recursive classes like trees. Here is a
fd595040 539quick example (soon to be expanded into a Moose::Cookbook::Recipe):
38e3283b 540
1cd45431 541 package Tree;
38e3283b 542 use Moose;
26fbace8 543
38e3283b 544 has 'node' => (is => 'rw', isa => 'Any');
26fbace8 545
38e3283b 546 has 'children' => (
547 is => 'ro',
548 isa => 'ArrayRef',
549 default => sub { [] }
550 );
26fbace8 551
38e3283b 552 has 'parent' => (
553 is => 'rw',
554 isa => 'Tree',
555 is_weak_ref => 1,
556 handles => {
557 parent_node => 'node',
26fbace8 558 siblings => 'children',
38e3283b 559 }
560 );
561
1cd45431 562In this example, the Tree package gets C<parent_node> and C<siblings> methods,
563which delegate to the C<node> and C<children> methods (respectively) of the Tree
26fbace8 564instance stored in the C<parent> slot.
38e3283b 565
566=item C<REGEXP>
567
26fbace8 568The regexp option works very similar to the ARRAY option, except that it builds
569the list of methods for you. It starts by collecting all possible methods of the
570class being delegated to, then filters that list using the regexp supplied here.
38e3283b 571
26fbace8 572B<NOTE:> An I<isa> option is required when using the regexp option format. This
573is so that we can determine (at compile time) the method list from the class.
38e3283b 574Without an I<isa> this is just not possible.
575
c84f324f 576=item C<ROLE>
577
26fbace8 578With the role option, you specify the name of a role whose "interface" then
579becomes the list of methods to handle. The "interface" can be defined as; the
580methods of the role and any required methods of the role. It should be noted
581that this does B<not> include any method modifiers or generated attribute
c84f324f 582methods (which is consistent with role composition).
583
38e3283b 584=item C<CODE>
585
1cd45431 586This is the option to use when you really want to do something funky. You should
587only use it if you really know what you are doing, as it involves manual
588metaclass twiddling.
38e3283b 589
1cd45431 590This takes a code reference, which should expect two arguments. The first is the
591attribute meta-object this I<handles> is attached to. The second is the
592metaclass of the class being delegated to. It expects you to return a hash (not
26fbace8 593a HASH ref) of the methods you want mapped.
38e3283b 594
595=back
2c0cbef7 596
6ba6d68c 597=back
598
cd7eeaf5 599=item B<has +$name =E<gt> %options>
600
26fbace8 601This is variation on the normal attibute creator C<has> which allows you to
cd7eeaf5 602clone and extend an attribute from a superclass. Here is a quick example:
603
604 package Foo;
605 use Moose;
26fbace8 606
cd7eeaf5 607 has 'message' => (
26fbace8 608 is => 'rw',
cd7eeaf5 609 isa => 'Str',
610 default => 'Hello, I am a Foo'
611 );
26fbace8 612
cd7eeaf5 613 package My::Foo;
614 use Moose;
26fbace8 615
cd7eeaf5 616 extends 'Foo';
26fbace8 617
cd7eeaf5 618 has '+message' => (default => 'Hello I am My::Foo');
619
1cd45431 620What is happening here is that B<My::Foo> is cloning the C<message> attribute
621from its parent class B<Foo>, retaining the C<is =E<gt> 'rw'> and C<isa =E<gt>
622'Str'> characteristics, but changing the value in C<default>.
cd7eeaf5 623
83cc9094 624This feature is restricted somewhat, so as to try and force at least I<some>
cd7eeaf5 625sanity into it. You are only allowed to change the following attributes:
626
627=over 4
628
26fbace8 629=item I<default>
cd7eeaf5 630
631Change the default value of an attribute.
632
26fbace8 633=item I<coerce>
cd7eeaf5 634
635Change whether the attribute attempts to coerce a value passed to it.
636
26fbace8 637=item I<required>
cd7eeaf5 638
639Change if the attribute is required to have a value.
640
641=item I<documentation>
642
643Change the documentation string associated with the attribute.
644
83cc9094 645=item I<lazy>
646
647Change if the attribute lazily initializes the slot.
648
cd7eeaf5 649=item I<isa>
650
1cd45431 651You I<are> allowed to change the type, B<if and only if> the new type is a
652subtype of the old type.
cd7eeaf5 653
83cc9094 654=item I<handles>
655
26fbace8 656You are allowed to B<add> a new C<handles> definition, but you are B<not>
657allowed to I<change> one.
83cc9094 658
cd7eeaf5 659=back
660
076c81ed 661=item B<before $name|@names =E<gt> sub { ... }>
6ba6d68c 662
076c81ed 663=item B<after $name|@names =E<gt> sub { ... }>
6ba6d68c 664
076c81ed 665=item B<around $name|@names =E<gt> sub { ... }>
6ba6d68c 666
d8af92ae 667This three items are syntactic sugar for the before, after, and around method
668modifier features that L<Class::MOP> provides. More information on these may be
669found in the L<Class::MOP::Class documentation|Class::MOP::Class/"Method
670Modifiers"> for now.
6ba6d68c 671
159da176 672=item B<super>
673
26fbace8 674The keyword C<super> is a no-op when called outside of an C<override> method. In
675the context of an C<override> method, it will call the next most appropriate
159da176 676superclass method with the same arguments as the original method.
677
678=item B<override ($name, &sub)>
679
26fbace8 680An C<override> method is a way of explicitly saying "I am overriding this
681method from my superclass". You can call C<super> within this method, and
682it will work as expected. The same thing I<can> be accomplished with a normal
683method call and the C<SUPER::> pseudo-package; it is really your choice.
159da176 684
685=item B<inner>
686
26fbace8 687The keyword C<inner>, much like C<super>, is a no-op outside of the context of
688an C<augment> method. You can think of C<inner> as being the inverse of
68efb014 689C<super>; the details of how C<inner> and C<augment> work is best described in
159da176 690the L<Moose::Cookbook>.
691
692=item B<augment ($name, &sub)>
693
26fbace8 694An C<augment> method, is a way of explicitly saying "I am augmenting this
695method from my superclass". Once again, the details of how C<inner> and
159da176 696C<augment> work is best described in the L<Moose::Cookbook>.
697
6ba6d68c 698=item B<confess>
699
68efb014 700This is the C<Carp::confess> function, and exported here because I use it
26fbace8 701all the time. This feature may change in the future, so you have been warned.
6ba6d68c 702
703=item B<blessed>
704
1cd45431 705This is the C<Scalar::Util::blessed> function, it is exported here because I
26fbace8 706use it all the time. It is highly recommended that this is used instead of
6ba6d68c 707C<ref> anywhere you need to test for an object's class name.
708
709=back
710
1cd45431 711=head1 UNIMPORTING FUNCTIONS
31f8ec72 712
713=head2 B<unimport>
714
1cd45431 715Moose offers a way to remove the keywords it exports, through the C<unimport>
31f8ec72 716method. You simply have to say C<no Moose> at the bottom of your code for this
717to work. Here is an example:
718
719 package Person;
720 use Moose;
721
722 has 'first_name' => (is => 'rw', isa => 'Str');
723 has 'last_name' => (is => 'rw', isa => 'Str');
26fbace8 724
725 sub full_name {
31f8ec72 726 my $self = shift;
26fbace8 727 $self->first_name . ' ' . $self->last_name
31f8ec72 728 }
26fbace8 729
730 no Moose; # keywords are removed from the Person package
31f8ec72 731
9bcfbab1 732=head1 EXTENDING AND EMBEDDING MOOSE
733
26fbace8 734Moose also offers some options for extending or embedding it into your own
9bcfbab1 735framework. The basic premise is to have something that sets up your class'
26fbace8 736metaclass and export the moose declarators (C<has>, C<with>, C<extends>,...).
9bcfbab1 737Here is an example:
738
739 package MyFramework;
740 use Moose;
26fbace8 741
9bcfbab1 742 sub import {
743 my $CALLER = caller();
744
745 strict->import;
746 warnings->import;
747
748 # we should never export to main
749 return if $CALLER eq 'main';
750 Moose::init_meta( $CALLER, 'MyFramework::Base' );
751 Moose->import({into => $CALLER});
752
753 # Do my custom framework stuff
26fbace8 754
9bcfbab1 755 return 1;
756 }
26fbace8 757
9bcfbab1 758=head2 B<import>
759
77a18c28 760Moose's C<import> method supports the L<Sub::Exporter> form of C<{into =E<gt> $pkg}>
9bcfbab1 761and C<{into_level =E<gt> 1}>
762
763=head2 B<init_meta ($class, $baseclass, $metaclass)>
764
26fbace8 765Moose does some boot strapping: it creates a metaclass object for your class,
766and then injects a C<meta> accessor into your class to retrieve it. Then it
767sets your baseclass to Moose::Object or the value you pass in unless you already
768have one. This is all done via C<init_meta> which takes the name of your class
2bbba362 769and optionally a baseclass and a metaclass as arguments.
26fbace8 770
05d9eaf6 771=head1 CAVEATS
772
773=over 4
774
775=item *
776
1cd45431 777It should be noted that C<super> and C<inner> B<cannot> be used in the same
778method. However, they may be combined within the same class hierarchy; see
779F<t/014_override_augment_inner_super.t> for an example.
05d9eaf6 780
26fbace8 781The reason for this is that C<super> is only valid within a method
782with the C<override> modifier, and C<inner> will never be valid within an
783C<override> method. In fact, C<augment> will skip over any C<override> methods
68efb014 784when searching for its appropriate C<inner>.
05d9eaf6 785
1cd45431 786This might seem like a restriction, but I am of the opinion that keeping these
787two features separate (yet interoperable) actually makes them easy to use, since
788their behavior is then easier to predict. Time will tell whether I am right or
c84f324f 789not (UPDATE: so far so good).
05d9eaf6 790
791=back
792
5569c072 793=head1 ACKNOWLEDGEMENTS
794
795=over 4
796
54c189df 797=item I blame Sam Vilain for introducing me to the insanity that is meta-models.
5569c072 798
54c189df 799=item I blame Audrey Tang for then encouraging my meta-model habit in #perl6.
5569c072 800
26fbace8 801=item Without Yuval "nothingmuch" Kogman this module would not be possible,
54c189df 802and it certainly wouldn't have this name ;P
5569c072 803
26fbace8 804=item The basis of the TypeContraints module was Rob Kinyon's idea
5569c072 805originally, I just ran with it.
806
26fbace8 807=item Thanks to mst & chansen and the whole #moose poose for all the
c84f324f 808early ideas/feature-requests/encouragement/bug-finding.
d46a48f3 809
68efb014 810=item Thanks to David "Theory" Wheeler for meta-discussions and spelling fixes.
811
5569c072 812=back
813
e90c03d0 814=head1 SEE ALSO
815
816=over 4
817
c84f324f 818=item L<http://www.iinteractive.com/moose>
819
820This is the official web home of Moose, it contains links to our public SVN repo
26fbace8 821as well as links to a number of talks and articles on Moose and Moose related
822technologies.
c84f324f 823
6ba6d68c 824=item L<Class::MOP> documentation
825
826=item The #moose channel on irc.perl.org
827
e67a0fca 828=item The Moose mailing list - moose@perl.org
829
c84f324f 830=item Moose stats on ohloh.net - L<http://www.ohloh.net/projects/5788>
831
28669f89 832=item Several Moose extension modules in the L<MooseX::> namespace.
833
c84f324f 834=back
835
26fbace8 836=head2 Papers
c84f324f 837
838=over 4
e90c03d0 839
159da176 840=item L<http://www.cs.utah.edu/plt/publications/oopsla04-gff.pdf>
841
26fbace8 842This paper (suggested by lbr on #moose) was what lead to the implementation
843of the C<super>/C<override> and C<inner>/C<augment> features. If you really
1cd45431 844want to understand them, I suggest you read this.
159da176 845
e90c03d0 846=back
847
fcd84ca9 848=head1 BUGS
849
26fbace8 850All complex software has bugs lurking in it, and this module is no
fcd84ca9 851exception. If you find a bug please either email me, or add the bug
852to cpan-RT.
853
fcd84ca9 854=head1 AUTHOR
855
856Stevan Little E<lt>stevan@iinteractive.comE<gt>
857
9af1d28b 858B<with contributions from:>
db1ab48d 859
9af1d28b 860Aankhen
861
862Adam (Alias) Kennedy
863
864Anders (Debolaz) Nor Berle
865
5868294f 866Nathan (kolibre) Gray
867
9af1d28b 868Christian (chansen) Hansen
869
e7f8d0c2 870Hans Dieter (confound) Pearcey
871
9af1d28b 872Eric (ewilhelm) Wilhelm
873
874Guillermo (groditi) Roditi
875
876Jess (castaway) Robinson
877
878Matt (mst) Trout
879
880Robert (phaylon) Sedlacek
881
882Robert (rlb3) Boone
883
884Scott (konobi) McWhirter
885
f44ae52f 886Shlomi (rindolf) Fish
887
9af1d28b 888Yuval (nothingmuch) Kogman
889
cbe25729 890Chris (perigrin) Prather
891
e46f5cc2 892Jonathan (jrockway) Rockway
893
3ccdc84a 894Piotr (dexter) Roszatycki
895
26fbace8 896Sam (mugwump) Vilain
f1917f58 897
ac211120 898Shawn (sartak) Moore
899
9af1d28b 900... and many other #moose folks
98aae381 901
fcd84ca9 902=head1 COPYRIGHT AND LICENSE
903
778db3ac 904Copyright 2006-2008 by Infinity Interactive, Inc.
fcd84ca9 905
906L<http://www.iinteractive.com>
907
908This library is free software; you can redistribute it and/or modify
26fbace8 909it under the same terms as Perl itself.
fcd84ca9 910
ddd0ec20 911=cut