forgot to update $VERSION
[gitmo/Moose.git] / lib / Moose.pm
CommitLineData
fcd84ca9 1
2package Moose;
3
4use strict;
5use warnings;
6
e2f70b7c 7our $VERSION = '0.22';
d44714be 8our $AUTHORITY = 'cpan:STEVAN';
fcd84ca9 9
cc65ead0 10use Scalar::Util 'blessed', 'reftype';
fcd84ca9 11use Carp 'confess';
bc1e29b5 12use Sub::Name 'subname';
31f8ec72 13use B 'svref_2object';
fcd84ca9 14
2d562421 15use Sub::Exporter;
7f18097c 16
ef1d5f4b 17use Class::MOP;
18
c0e30cf5 19use Moose::Meta::Class;
7415b2cb 20use Moose::Meta::TypeConstraint;
7c13858b 21use Moose::Meta::TypeCoercion;
78cd1d3b 22use Moose::Meta::Attribute;
ddd0ec20 23use Moose::Meta::Instance;
c0e30cf5 24
fcd84ca9 25use Moose::Object;
7415b2cb 26use Moose::Util::TypeConstraints;
a15dff8d 27
a3c7e2fe 28{
be33e4f3 29 my $CALLER;
a3c7e2fe 30
be33e4f3 31 sub _init_meta {
a3c7e2fe 32 my $class = $CALLER;
33
a3c7e2fe 34 # make a subtype for each Moose class
35 subtype $class
36 => as 'Object'
37 => where { $_->isa($class) }
8ecb1fa0 38 => optimize_as { blessed($_[0]) && $_[0]->isa($class) }
a3c7e2fe 39 unless find_type_constraint($class);
40
41 my $meta;
42 if ($class->can('meta')) {
fcec2383 43 # NOTE:
44 # this is the case where the metaclass pragma
45 # was used before the 'use Moose' statement to
46 # override a specific class
a3c7e2fe 47 $meta = $class->meta();
48 (blessed($meta) && $meta->isa('Moose::Meta::Class'))
66bcefc1 49 || confess "You already have a &meta function, but it does not return a Moose::Meta::Class";
a3c7e2fe 50 }
51 else {
fcec2383 52 # NOTE:
53 # this is broken currently, we actually need
54 # to allow the possiblity of an inherited
55 # meta, which will not be visible until the
56 # user 'extends' first. This needs to have
57 # more intelligence to it
590868a3 58 $meta = Moose::Meta::Class->initialize($class);
a3c7e2fe 59 $meta->add_method('meta' => sub {
60 # re-initialize so it inherits properly
fcb7afc2 61 Moose::Meta::Class->initialize(blessed($_[0]) || $_[0]);
a3c7e2fe 62 })
63 }
64
65 # make sure they inherit from Moose::Object
66 $meta->superclasses('Moose::Object')
67 unless $meta->superclasses();
a3c7e2fe 68 }
69
70 my %exports = (
71 extends => sub {
be33e4f3 72 my $class = $CALLER;
68117c45 73 return subname 'Moose::extends' => sub (@) {
74 confess "Must derive at least one class" unless @_;
1eaed09d 75 Class::MOP::load_class($_) for @_;
1341f10c 76 # this checks the metaclass to make sure
77 # it is correct, sometimes it can get out
78 # of sync when the classes are being built
79 my $meta = $class->meta->_fix_metaclass_incompatability(@_);
be33e4f3 80 $meta->superclasses(@_);
a3c7e2fe 81 };
82 },
83 with => sub {
be33e4f3 84 my $class = $CALLER;
68117c45 85 return subname 'Moose::with' => sub (@) {
db1ab48d 86 my (@roles) = @_;
68117c45 87 confess "Must specify at least one role" unless @roles;
1eaed09d 88 Class::MOP::load_class($_) for @roles;
1341f10c 89 $class->meta->_apply_all_roles(@roles);
a3c7e2fe 90 };
91 },
92 has => sub {
be33e4f3 93 my $class = $CALLER;
2c0cbef7 94 return subname 'Moose::has' => sub ($;%) {
f6e5456f 95 my ($name, %options) = @_;
96 my $attrs = (ref($name) eq 'ARRAY') ? $name : [($name)];
97 $class->meta->_process_attribute($_, %options) for @$attrs;
a3c7e2fe 98 };
99 },
100 before => sub {
be33e4f3 101 my $class = $CALLER;
2c0cbef7 102 return subname 'Moose::before' => sub (@&) {
a3c7e2fe 103 my $code = pop @_;
be33e4f3 104 my $meta = $class->meta;
a3c7e2fe 105 $meta->add_before_method_modifier($_, $code) for @_;
106 };
107 },
108 after => sub {
be33e4f3 109 my $class = $CALLER;
2c0cbef7 110 return subname 'Moose::after' => sub (@&) {
a3c7e2fe 111 my $code = pop @_;
be33e4f3 112 my $meta = $class->meta;
a3c7e2fe 113 $meta->add_after_method_modifier($_, $code) for @_;
114 };
115 },
116 around => sub {
be33e4f3 117 my $class = $CALLER;
2c0cbef7 118 return subname 'Moose::around' => sub (@&) {
a3c7e2fe 119 my $code = pop @_;
be33e4f3 120 my $meta = $class->meta;
a3c7e2fe 121 $meta->add_around_method_modifier($_, $code) for @_;
122 };
123 },
124 super => sub {
52c7c330 125 {
126 our %SUPER_SLOT;
127 no strict 'refs';
128 $SUPER_SLOT{$CALLER} = \*{"${CALLER}::super"};
129 }
3d544ed5 130 return subname 'Moose::super' => sub {};
a3c7e2fe 131 },
132 override => sub {
be33e4f3 133 my $class = $CALLER;
2c0cbef7 134 return subname 'Moose::override' => sub ($&) {
a3c7e2fe 135 my ($name, $method) = @_;
be33e4f3 136 $class->meta->add_override_method_modifier($name => $method);
a3c7e2fe 137 };
138 },
139 inner => sub {
52c7c330 140 {
141 our %INNER_SLOT;
142 no strict 'refs';
143 $INNER_SLOT{$CALLER} = \*{"${CALLER}::inner"};
144 }
3d544ed5 145 return subname 'Moose::inner' => sub {};
a3c7e2fe 146 },
147 augment => sub {
be33e4f3 148 my $class = $CALLER;
2c0cbef7 149 return subname 'Moose::augment' => sub (@&) {
a3c7e2fe 150 my ($name, $method) = @_;
be33e4f3 151 $class->meta->add_augment_method_modifier($name => $method);
a3c7e2fe 152 };
153 },
3279ab4a 154
68efb014 155 # NOTE:
2a0f3bd3 156 # this is experimental, but I am not
157 # happy with it. If you want to try
158 # it, you will have to uncomment it
159 # yourself.
160 # There is a really good chance that
161 # this will be deprecated, dont get
162 # too attached
163 # self => sub {
164 # return subname 'Moose::self' => sub {};
165 # },
166 # method => sub {
167 # my $class = $CALLER;
168 # return subname 'Moose::method' => sub {
169 # my ($name, $method) = @_;
170 # $class->meta->add_method($name, sub {
171 # my $self = shift;
172 # no strict 'refs';
173 # no warnings 'redefine';
174 # local *{$class->meta->name . '::self'} = sub { $self };
175 # $method->(@_);
176 # });
177 # };
178 # },
3279ab4a 179
a3c7e2fe 180 confess => sub {
181 return \&Carp::confess;
182 },
183 blessed => sub {
184 return \&Scalar::Util::blessed;
66bcefc1 185 },
a3c7e2fe 186 );
3d544ed5 187
a3c7e2fe 188 my $exporter = Sub::Exporter::build_exporter({
189 exports => \%exports,
190 groups => {
191 default => [':all']
192 }
193 });
194
fcb7afc2 195 sub import {
a3c7e2fe 196 $CALLER = caller();
c235cd98 197
198 strict->import;
199 warnings->import;
a3c7e2fe 200
201 # we should never export to main
202 return if $CALLER eq 'main';
be33e4f3 203
204 _init_meta();
9eacbf7c 205
a3c7e2fe 206 goto $exporter;
fcb7afc2 207 }
31f8ec72 208
209 sub unimport {
210 no strict 'refs';
211 my $class = caller();
212 # loop through the exports ...
213 foreach my $name (keys %exports) {
214
215 # if we find one ...
216 if (defined &{$class . '::' . $name}) {
217 my $keyword = \&{$class . '::' . $name};
218
219 # make sure it is from Moose
220 my $pkg_name = eval { svref_2object($keyword)->GV->STASH->NAME };
221 next if $@;
222 next if $pkg_name ne 'Moose';
223
224 # and if it is from Moose then undef the slot
225 delete ${$class . '::'}{$name};
226 }
227 }
228 }
5cf3dbcf 229
230
fcd84ca9 231}
232
8ecb1fa0 233## make 'em all immutable
234
235$_->meta->make_immutable(
236 inline_constructor => 0,
237 inline_accessors => 0,
238) for (
239 'Moose::Meta::Attribute',
240 'Moose::Meta::Class',
241 'Moose::Meta::Instance',
242
243 'Moose::Meta::TypeConstraint',
244 'Moose::Meta::TypeConstraint::Union',
245 'Moose::Meta::TypeCoercion',
246
247 'Moose::Meta::Method',
248 'Moose::Meta::Method::Accessor',
249 'Moose::Meta::Method::Constructor',
250 'Moose::Meta::Method::Overriden',
251);
252
fcd84ca9 2531;
254
255__END__
256
257=pod
258
259=head1 NAME
260
31f8ec72 261Moose - A complete modern object system for Perl 5
fcd84ca9 262
263=head1 SYNOPSIS
e522431d 264
265 package Point;
43d599e5 266 use strict;
267 use warnings;
e522431d 268 use Moose;
269
43d599e5 270 has 'x' => (is => 'rw', isa => 'Int');
271 has 'y' => (is => 'rw', isa => 'Int');
e522431d 272
273 sub clear {
274 my $self = shift;
275 $self->x(0);
276 $self->y(0);
277 }
278
279 package Point3D;
43d599e5 280 use strict;
281 use warnings;
e522431d 282 use Moose;
283
284 extends 'Point';
09fdc1dc 285
43d599e5 286 has 'z' => (is => 'rw', isa => 'Int');
e522431d 287
288 after 'clear' => sub {
289 my $self = shift;
43d599e5 290 $self->z(0);
734d1752 291 };
2c0cbef7 292
fcd84ca9 293=head1 DESCRIPTION
294
e522431d 295Moose is an extension of the Perl 5 object system.
296
297=head2 Another object system!?!?
fcd84ca9 298
e522431d 299Yes, I know there has been an explosion recently of new ways to
68efb014 300build object's in Perl 5, most of them based on inside-out objects
e522431d 301and other such things. Moose is different because it is not a new
302object system for Perl 5, but instead an extension of the existing
303object system.
3c7278fb 304
e522431d 305Moose is built on top of L<Class::MOP>, which is a metaclass system
306for Perl 5. This means that Moose not only makes building normal
505c6fac 307Perl 5 objects better, but it also provides the power of metaclass
308programming.
e522431d 309
734d1752 310=head2 Is this for real? Or is this just an experiment?
e522431d 311
2c0cbef7 312Moose is I<based> on the prototypes and experiments I did for the Perl 6
68efb014 313meta-model; however Moose is B<NOT> an experiment/prototype, it is
734d1752 314for B<real>.
315
d44714be 316=head2 Is this ready for use in production?
317
318Yes, I believe that it is.
734d1752 319
320I have two medium-to-large-ish web applications which use Moose heavily
321and have been in production (without issue) for several months now. At
322$work, we are re-writing our core offering in it. And several people on
323#moose have been using it (in production) for several months now as well.
e522431d 324
d44714be 325Of course, in the end, you need to make this call yourself. If you have
326any questions or concerns, please feel free to email me, or even the list
327or just stop by #moose and ask away.
328
43d599e5 329=head2 Is Moose just Perl 6 in Perl 5?
e522431d 330
68efb014 331No. While Moose is very much inspired by Perl 6, it is not itself Perl 6.
332Instead, it is an OO system for Perl 5. I built Moose because I was tired or
333writing the same old boring Perl 5 OO code, and drooling over Perl 6 OO. So
334instead of switching to Ruby, I wrote Moose :)
3c7278fb 335
6ba6d68c 336=head1 BUILDING CLASSES WITH MOOSE
337
68efb014 338Moose makes every attempt to provide as much convenience as possible during
339class construction/definition, but still stay out of your way if you want it
340to. Here are a few items to note when building classes with Moose.
6ba6d68c 341
342Unless specified with C<extends>, any class which uses Moose will
343inherit from L<Moose::Object>.
344
345Moose will also manage all attributes (including inherited ones) that
68efb014 346are defined with C<has>. And assuming that you call C<new>, which is
6ba6d68c 347inherited from L<Moose::Object>, then this includes properly initializing
68efb014 348all instance slots, setting defaults where appropriate, and performing any
6ba6d68c 349type constraint checking or coercion.
350
351=head1 EXPORTED FUNCTIONS
352
68efb014 353Moose will export a number of functions into the class's namespace which
6ba6d68c 354can then be used to set up the class. These functions all work directly
355on the current class.
356
357=over 4
358
359=item B<meta>
360
361This is a method which provides access to the current class's metaclass.
362
363=item B<extends (@superclasses)>
364
365This function will set the superclass(es) for the current class.
366
367This approach is recommended instead of C<use base>, because C<use base>
368actually C<push>es onto the class's C<@ISA>, whereas C<extends> will
369replace it. This is important to ensure that classes which do not have
68efb014 370superclasses still properly inherit from L<Moose::Object>.
6ba6d68c 371
43d599e5 372=item B<with (@roles)>
e9ec68d6 373
43d599e5 374This will apply a given set of C<@roles> to the local class. Role support
68efb014 375is currently under heavy development; see L<Moose::Role> for more details.
e9ec68d6 376
cd7eeaf5 377=item B<has $name =E<gt> %options>
6ba6d68c 378
379This will install an attribute of a given C<$name> into the current class.
43d599e5 380The list of C<%options> are the same as those provided by
381L<Class::MOP::Attribute>, in addition to the list below which are provided
382by Moose (L<Moose::Meta::Attribute> to be more specific):
6ba6d68c 383
384=over 4
385
076c81ed 386=item I<is =E<gt> 'rw'|'ro'>
6ba6d68c 387
388The I<is> option accepts either I<rw> (for read/write) or I<ro> (for read
389only). These will create either a read/write accessor or a read-only
390accessor respectively, using the same name as the C<$name> of the attribute.
391
392If you need more control over how your accessors are named, you can use the
43d599e5 393I<reader>, I<writer> and I<accessor> options inherited from L<Class::MOP::Attribute>.
6ba6d68c 394
076c81ed 395=item I<isa =E<gt> $type_name>
6ba6d68c 396
397The I<isa> option uses Moose's type constraint facilities to set up runtime
398type checking for this attribute. Moose will perform the checks during class
399construction, and within any accessors. The C<$type_name> argument must be a
68efb014 400string. The string can be either a class name or a type defined using
401Moose's type definition features.
6ba6d68c 402
daea75c9 403=item I<coerce =E<gt> (1|0)>
404
405This will attempt to use coercion with the supplied type constraint to change
68efb014 406the value passed into any accessors or constructors. You B<must> have supplied
daea75c9 407a type constraint in order for this to work. See L<Moose::Cookbook::Recipe5>
408for an example usage.
409
410=item I<does =E<gt> $role_name>
411
412This will accept the name of a role which the value stored in this attribute
413is expected to have consumed.
414
415=item I<required =E<gt> (1|0)>
416
417This marks the attribute as being required. This means a value must be supplied
418during class construction, and the attribute can never be set to C<undef> with
419an accessor.
420
421=item I<weak_ref =E<gt> (1|0)>
422
68efb014 423This will tell the class to store the value of this attribute as a weakened
424reference. If an attribute is a weakened reference, it B<cannot> also be
425coerced.
daea75c9 426
427=item I<lazy =E<gt> (1|0)>
428
68efb014 429This will tell the class to not create this slot until absolutely necessary.
daea75c9 430If an attribute is marked as lazy it B<must> have a default supplied.
431
9e93dd19 432=item I<auto_deref =E<gt> (1|0)>
433
68efb014 434This tells the accessor whether to automatically dereference the value returned.
9e93dd19 435This is only legal if your C<isa> option is either an C<ArrayRef> or C<HashRef>.
436
c1935ade 437=item I<metaclass =E<gt> $metaclass_name>
438
439This tells the class to use a custom attribute metaclass for this particular
440attribute. Custom attribute metaclasses are useful for extending the capabilities
441of the I<has> keyword, they are the simplest way to extend the MOP, but they are
442still a fairly advanced topic and too much to cover here. I will try and write a
443recipe on it soon.
444
445The default behavior here is to just load C<$metaclass_name>, however, we also
446have a way to alias to a shorter name. This will first look to see if
447B<Moose::Meta::Attribute::Custom::$metaclass_name> exists, if it does it will
448then check to see if that has the method C<register_implemenetation> which
449should return the actual name of the custom attribute metaclass. If there is
450no C<register_implemenetation> method, it will just default to using
451B<Moose::Meta::Attribute::Custom::$metaclass_name> as the metaclass name.
452
daea75c9 453=item I<trigger =E<gt> $code>
454
455The trigger option is a CODE reference which will be called after the value of
456the attribute is set. The CODE ref will be passed the instance itself, the
457updated value and the attribute meta-object (this is for more advanced fiddling
68efb014 458and can typically be ignored in most cases). You B<cannot> have a trigger on
cce8198b 459a read-only attribute.
daea75c9 460
38e3283b 461=item I<handles =E<gt> ARRAY | HASH | REGEXP | CODE>
2c0cbef7 462
38e3283b 463The handles option provides Moose classes with automated delegation features.
464This is a pretty complex and powerful option, it accepts many different option
465formats, each with it's own benefits and drawbacks.
466
467B<NOTE:> This features is no longer experimental, but it still may have subtle
fd595040 468bugs lurking in the deeper corners. So if you think you have found a bug, you
469probably have, so please report it to me right away.
38e3283b 470
100e4d84 471B<NOTE:> The class being delegated to does not need to be a Moose based class.
38e3283b 472Which is why this feature is especially useful when wrapping non-Moose classes.
473
474All handles option formats share the following traits.
475
476You cannot override a locally defined method with a delegated method, an
477exception will be thrown if you try. Meaning, if you define C<foo> in your
478class, 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
480not use Moose.
481
fd595040 482You cannot override any of the methods found in Moose::Object as well as
483C<BUILD> or C<DEMOLISH> methods. These will not throw an exception, but will
484silently move on to the next method in the list. My reasoning for this is that
485you would almost never want to do this because it usually tends to break your
486class. And as with overriding locally defined methods, if you do want to do this,
38e3283b 487you should do it manually and not with Moose.
488
489Below is the documentation for each option format:
490
491=over 4
492
493=item C<ARRAY>
494
495This is the most common usage for handles. You basically pass a list of
496method names to be delegated, and Moose will install a delegation method
497for each one in the list.
498
499=item C<HASH>
500
501This is the second most common usage for handles. Instead of a list of
502method names, you pass a HASH ref where the key is the method name you
503want installed locally, and the value is the name of the original method
3dd4490b 504in the class being delegated to.
fd595040 505
506This can be very useful for recursive classes like trees, here is a
507quick example (soon to be expanded into a Moose::Cookbook::Recipe):
38e3283b 508
509 pacakge Tree;
510 use Moose;
511
512 has 'node' => (is => 'rw', isa => 'Any');
513
514 has 'children' => (
515 is => 'ro',
516 isa => 'ArrayRef',
517 default => sub { [] }
518 );
519
520 has 'parent' => (
521 is => 'rw',
522 isa => 'Tree',
523 is_weak_ref => 1,
524 handles => {
525 parent_node => 'node',
526 siblings => 'children',
527 }
528 );
529
530In this example, the Tree package gets the C<parent_node> and C<siblings> methods
531which delegate to the C<node> and C<children> methods of the Tree instance stored
532in the parent slot.
533
534=item C<REGEXP>
535
536The regexp option works very similar to the ARRAY option, except that it builds
537the list of methods for you. It starts by collecting all possible methods of the
3dd4490b 538class being delegated to, then filters that list using the regexp supplied here.
38e3283b 539
540B<NOTE:> An I<isa> option is required when using the regexp option format. This
541is so that we can determine (at compile time) the method list from the class.
542Without an I<isa> this is just not possible.
543
544=item C<CODE>
545
fd595040 546This is the option to use when you really want to do something funky. You should
547only use it if you really know what you are doing as it involves manual metaclass
548twiddling.
38e3283b 549
fd595040 550This takes a code reference, which should expect two arguments. The first is
3dd4490b 551the attribute meta-object this I<handles> is attached to. The second is the metaclass
552of the class being delegated to. It expects you to return a hash (not a HASH ref)
fd595040 553of the methods you want mapped.
38e3283b 554
555=back
2c0cbef7 556
6ba6d68c 557=back
558
cd7eeaf5 559=item B<has +$name =E<gt> %options>
560
561This is variation on the normal attibute creator C<has>, which allows you to
562clone and extend an attribute from a superclass. Here is a quick example:
563
564 package Foo;
565 use Moose;
566
567 has 'message' => (
568 is => 'rw',
569 isa => 'Str',
570 default => 'Hello, I am a Foo'
571 );
572
573 package My::Foo;
574 use Moose;
575
576 extends 'Foo';
577
578 has '+message' => (default => 'Hello I am My::Foo');
579
580What is happening here is that B<My::Foo> is cloning the C<message> attribute
581from it's parent class B<Foo>, retaining the is =E<gt> 'rw' and isa =E<gt> 'Str'
582characteristics, but changing the value in C<default>.
583
584This feature is restricted somewhat, so as to try and enfore at least I<some>
585sanity into it. You are only allowed to change the following attributes:
586
587=over 4
588
589=item I<default>
590
591Change the default value of an attribute.
592
593=item I<coerce>
594
595Change whether the attribute attempts to coerce a value passed to it.
596
597=item I<required>
598
599Change if the attribute is required to have a value.
600
601=item I<documentation>
602
603Change the documentation string associated with the attribute.
604
605=item I<isa>
606
607You I<are> allowed to change the type, but if and B<only if> the new type is
608a subtype of the old type.
609
610=back
611
076c81ed 612=item B<before $name|@names =E<gt> sub { ... }>
6ba6d68c 613
076c81ed 614=item B<after $name|@names =E<gt> sub { ... }>
6ba6d68c 615
076c81ed 616=item B<around $name|@names =E<gt> sub { ... }>
6ba6d68c 617
68efb014 618This three items are syntactic sugar for the before, after, and around method
6ba6d68c 619modifier features that L<Class::MOP> provides. More information on these can
620be found in the L<Class::MOP> documentation for now.
621
159da176 622=item B<super>
623
68efb014 624The keyword C<super> is a no-op when called outside of an C<override> method. In
159da176 625the context of an C<override> method, it will call the next most appropriate
626superclass method with the same arguments as the original method.
627
628=item B<override ($name, &sub)>
629
68efb014 630An C<override> method is a way of explicitly saying "I am overriding this
159da176 631method from my superclass". You can call C<super> within this method, and
632it will work as expected. The same thing I<can> be accomplished with a normal
68efb014 633method call and the C<SUPER::> pseudo-package; it is really your choice.
159da176 634
635=item B<inner>
636
637The keyword C<inner>, much like C<super>, is a no-op outside of the context of
638an C<augment> method. You can think of C<inner> as being the inverse of
68efb014 639C<super>; the details of how C<inner> and C<augment> work is best described in
159da176 640the L<Moose::Cookbook>.
641
642=item B<augment ($name, &sub)>
643
68efb014 644An C<augment> method, is a way of explicitly saying "I am augmenting this
159da176 645method from my superclass". Once again, the details of how C<inner> and
646C<augment> work is best described in the L<Moose::Cookbook>.
647
6ba6d68c 648=item B<confess>
649
68efb014 650This is the C<Carp::confess> function, and exported here because I use it
6ba6d68c 651all the time. This feature may change in the future, so you have been warned.
652
653=item B<blessed>
654
68efb014 655This is the C<Scalar::Uti::blessed> function, it is exported here because I
6ba6d68c 656use it all the time. It is highly recommended that this is used instead of
657C<ref> anywhere you need to test for an object's class name.
658
659=back
660
31f8ec72 661=head1 UNEXPORTING FUNCTIONS
662
663=head2 B<unimport>
664
665Moose offers a way of removing the keywords it exports though the C<unimport>
666method. You simply have to say C<no Moose> at the bottom of your code for this
667to work. Here is an example:
668
669 package Person;
670 use Moose;
671
672 has 'first_name' => (is => 'rw', isa => 'Str');
673 has 'last_name' => (is => 'rw', isa => 'Str');
674
675 sub full_name {
676 my $self = shift;
677 $self->first_name . ' ' . $self->last_name
678 }
679
680 no Moose; # keywords are removed from the Person package
681
2c0cbef7 682=head1 MISC.
683
684=head2 What does Moose stand for??
685
686Moose doesn't stand for one thing in particular, however, if you
68efb014 687want, here are a few of my favorites; feel free to contribute
2c0cbef7 688more :)
689
690=over 4
691
692=item Make Other Object Systems Envious
693
694=item Makes Object Orientation So Easy
695
696=item Makes Object Orientation Spiffy- Er (sorry ingy)
697
698=item Most Other Object Systems Emasculate
699
2c0cbef7 700=item Moose Often Ovulate Sorta Early
701
2c0cbef7 702=item Moose Offers Often Super Extensions
703
704=item Meta Object Orientation Syntax Extensions
705
706=back
707
05d9eaf6 708=head1 CAVEATS
709
710=over 4
711
712=item *
713
68efb014 714It should be noted that C<super> and C<inner> C<cannot> be used in the same
715method. However, they can be combined together with the same class hierarchy;
05d9eaf6 716see F<t/014_override_augment_inner_super.t> for an example.
717
68efb014 718The reason for this is that C<super> is only valid within a method
05d9eaf6 719with the C<override> modifier, and C<inner> will never be valid within an
720C<override> method. In fact, C<augment> will skip over any C<override> methods
68efb014 721when searching for its appropriate C<inner>.
05d9eaf6 722
723This might seem like a restriction, but I am of the opinion that keeping these
68efb014 724two features separate (but interoperable) actually makes them easy to use, since
05d9eaf6 725their behavior is then easier to predict. Time will tell if I am right or not.
726
727=back
728
5569c072 729=head1 ACKNOWLEDGEMENTS
730
731=over 4
732
54c189df 733=item I blame Sam Vilain for introducing me to the insanity that is meta-models.
5569c072 734
54c189df 735=item I blame Audrey Tang for then encouraging my meta-model habit in #perl6.
5569c072 736
076c81ed 737=item Without Yuval "nothingmuch" Kogman this module would not be possible,
54c189df 738and it certainly wouldn't have this name ;P
5569c072 739
740=item The basis of the TypeContraints module was Rob Kinyon's idea
741originally, I just ran with it.
742
076c81ed 743=item Thanks to mst & chansen and the whole #moose poose for all the
fd595040 744ideas/feature-requests/encouragement/bug-finding.
d46a48f3 745
68efb014 746=item Thanks to David "Theory" Wheeler for meta-discussions and spelling fixes.
747
5569c072 748=back
749
e90c03d0 750=head1 SEE ALSO
751
752=over 4
753
6ba6d68c 754=item L<Class::MOP> documentation
755
756=item The #moose channel on irc.perl.org
757
e67a0fca 758=item The Moose mailing list - moose@perl.org
759
e90c03d0 760=item L<http://forum2.org/moose/>
761
159da176 762=item L<http://www.cs.utah.edu/plt/publications/oopsla04-gff.pdf>
763
764This paper (suggested by lbr on #moose) was what lead to the implementation
765of the C<super>/C<overrride> and C<inner>/C<augment> features. If you really
766want to understand this feature, I suggest you read this.
767
e90c03d0 768=back
769
fcd84ca9 770=head1 BUGS
771
772All complex software has bugs lurking in it, and this module is no
773exception. If you find a bug please either email me, or add the bug
774to cpan-RT.
775
fcd84ca9 776=head1 AUTHOR
777
778Stevan Little E<lt>stevan@iinteractive.comE<gt>
779
db1ab48d 780Christian Hansen E<lt>chansen@cpan.orgE<gt>
781
782Yuval Kogman E<lt>nothingmuch@woobling.orgE<gt>
98aae381 783
fcd84ca9 784=head1 COPYRIGHT AND LICENSE
785
b77fdbed 786Copyright 2006, 2007 by Infinity Interactive, Inc.
fcd84ca9 787
788L<http://www.iinteractive.com>
789
790This library is free software; you can redistribute it and/or modify
791it under the same terms as Perl itself.
792
ddd0ec20 793=cut