Minor doc fixes
[gitmo/Moose.git] / lib / Moose.pm
CommitLineData
fcd84ca9 1
2package Moose;
3
4use strict;
5use warnings;
6
7688dd05 7our $VERSION = '0.17';
fcd84ca9 8
cc65ead0 9use Scalar::Util 'blessed', 'reftype';
fcd84ca9 10use Carp 'confess';
bc1e29b5 11use Sub::Name 'subname';
31f8ec72 12use B 'svref_2object';
fcd84ca9 13
2d562421 14use Sub::Exporter;
7f18097c 15
ef1d5f4b 16use Class::MOP;
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
fcd84ca9 24use Moose::Object;
7415b2cb 25use Moose::Util::TypeConstraints;
a15dff8d 26
a3c7e2fe 27{
be33e4f3 28 my $CALLER;
a3c7e2fe 29
be33e4f3 30 sub _init_meta {
a3c7e2fe 31 my $class = $CALLER;
32
a3c7e2fe 33 # make a subtype for each Moose class
34 subtype $class
35 => as 'Object'
36 => where { $_->isa($class) }
c8cf9aaa 37 => optimize_as { blessed($_[0]) && $_[0]->isa($class) }
a3c7e2fe 38 unless find_type_constraint($class);
39
40 my $meta;
41 if ($class->can('meta')) {
fcec2383 42 # NOTE:
43 # this is the case where the metaclass pragma
44 # was used before the 'use Moose' statement to
45 # override a specific class
a3c7e2fe 46 $meta = $class->meta();
47 (blessed($meta) && $meta->isa('Moose::Meta::Class'))
66bcefc1 48 || confess "You already have a &meta function, but it does not return a Moose::Meta::Class";
a3c7e2fe 49 }
50 else {
fcec2383 51 # NOTE:
52 # this is broken currently, we actually need
53 # to allow the possiblity of an inherited
54 # meta, which will not be visible until the
55 # user 'extends' first. This needs to have
56 # more intelligence to it
590868a3 57 $meta = Moose::Meta::Class->initialize($class);
a3c7e2fe 58 $meta->add_method('meta' => sub {
59 # re-initialize so it inherits properly
fcb7afc2 60 Moose::Meta::Class->initialize(blessed($_[0]) || $_[0]);
a3c7e2fe 61 })
62 }
63
64 # make sure they inherit from Moose::Object
65 $meta->superclasses('Moose::Object')
66 unless $meta->superclasses();
a3c7e2fe 67 }
68
69 my %exports = (
70 extends => sub {
be33e4f3 71 my $class = $CALLER;
68117c45 72 return subname 'Moose::extends' => sub (@) {
73 confess "Must derive at least one class" unless @_;
a3c7e2fe 74 _load_all_classes(@_);
1341f10c 75 # this checks the metaclass to make sure
76 # it is correct, sometimes it can get out
77 # of sync when the classes are being built
78 my $meta = $class->meta->_fix_metaclass_incompatability(@_);
be33e4f3 79 $meta->superclasses(@_);
a3c7e2fe 80 };
81 },
82 with => sub {
be33e4f3 83 my $class = $CALLER;
68117c45 84 return subname 'Moose::with' => sub (@) {
db1ab48d 85 my (@roles) = @_;
68117c45 86 confess "Must specify at least one role" unless @roles;
db1ab48d 87 _load_all_classes(@roles);
1341f10c 88 $class->meta->_apply_all_roles(@roles);
a3c7e2fe 89 };
90 },
91 has => sub {
be33e4f3 92 my $class = $CALLER;
2c0cbef7 93 return subname 'Moose::has' => sub ($;%) {
452bac1b 94 my ($name, %options) = @_;
1341f10c 95 $class->meta->_process_attribute($name, %options);
a3c7e2fe 96 };
97 },
98 before => sub {
be33e4f3 99 my $class = $CALLER;
2c0cbef7 100 return subname 'Moose::before' => sub (@&) {
a3c7e2fe 101 my $code = pop @_;
be33e4f3 102 my $meta = $class->meta;
a3c7e2fe 103 $meta->add_before_method_modifier($_, $code) for @_;
104 };
105 },
106 after => sub {
be33e4f3 107 my $class = $CALLER;
2c0cbef7 108 return subname 'Moose::after' => sub (@&) {
a3c7e2fe 109 my $code = pop @_;
be33e4f3 110 my $meta = $class->meta;
a3c7e2fe 111 $meta->add_after_method_modifier($_, $code) for @_;
112 };
113 },
114 around => sub {
be33e4f3 115 my $class = $CALLER;
2c0cbef7 116 return subname 'Moose::around' => sub (@&) {
a3c7e2fe 117 my $code = pop @_;
be33e4f3 118 my $meta = $class->meta;
a3c7e2fe 119 $meta->add_around_method_modifier($_, $code) for @_;
120 };
121 },
122 super => sub {
3d544ed5 123 return subname 'Moose::super' => sub {};
a3c7e2fe 124 },
125 override => sub {
be33e4f3 126 my $class = $CALLER;
2c0cbef7 127 return subname 'Moose::override' => sub ($&) {
a3c7e2fe 128 my ($name, $method) = @_;
be33e4f3 129 $class->meta->add_override_method_modifier($name => $method);
a3c7e2fe 130 };
131 },
132 inner => sub {
3d544ed5 133 return subname 'Moose::inner' => sub {};
a3c7e2fe 134 },
135 augment => sub {
be33e4f3 136 my $class = $CALLER;
2c0cbef7 137 return subname 'Moose::augment' => sub (@&) {
a3c7e2fe 138 my ($name, $method) = @_;
be33e4f3 139 $class->meta->add_augment_method_modifier($name => $method);
a3c7e2fe 140 };
141 },
3279ab4a 142
68efb014 143 # NOTE:
2a0f3bd3 144 # this is experimental, but I am not
145 # happy with it. If you want to try
146 # it, you will have to uncomment it
147 # yourself.
148 # There is a really good chance that
149 # this will be deprecated, dont get
150 # too attached
151 # self => sub {
152 # return subname 'Moose::self' => sub {};
153 # },
154 # method => sub {
155 # my $class = $CALLER;
156 # return subname 'Moose::method' => sub {
157 # my ($name, $method) = @_;
158 # $class->meta->add_method($name, sub {
159 # my $self = shift;
160 # no strict 'refs';
161 # no warnings 'redefine';
162 # local *{$class->meta->name . '::self'} = sub { $self };
163 # $method->(@_);
164 # });
165 # };
166 # },
3279ab4a 167
a3c7e2fe 168 confess => sub {
169 return \&Carp::confess;
170 },
171 blessed => sub {
172 return \&Scalar::Util::blessed;
66bcefc1 173 },
a3c7e2fe 174 );
3d544ed5 175
a3c7e2fe 176 my $exporter = Sub::Exporter::build_exporter({
177 exports => \%exports,
178 groups => {
179 default => [':all']
180 }
181 });
182
fcb7afc2 183 sub import {
a3c7e2fe 184 $CALLER = caller();
c235cd98 185
186 strict->import;
187 warnings->import;
a3c7e2fe 188
189 # we should never export to main
190 return if $CALLER eq 'main';
be33e4f3 191
192 _init_meta();
9eacbf7c 193
a3c7e2fe 194 goto $exporter;
fcb7afc2 195 }
31f8ec72 196
197 sub unimport {
198 no strict 'refs';
199 my $class = caller();
200 # loop through the exports ...
201 foreach my $name (keys %exports) {
3279ab4a 202 next if $name =~ /inner|super|self/;
31f8ec72 203
204 # if we find one ...
205 if (defined &{$class . '::' . $name}) {
206 my $keyword = \&{$class . '::' . $name};
207
208 # make sure it is from Moose
209 my $pkg_name = eval { svref_2object($keyword)->GV->STASH->NAME };
210 next if $@;
211 next if $pkg_name ne 'Moose';
212
213 # and if it is from Moose then undef the slot
214 delete ${$class . '::'}{$name};
215 }
216 }
217 }
fcd84ca9 218}
219
e9bb8a31 220## Utility functions
221
78cd1d3b 222sub _load_all_classes {
f90dc7ee 223 foreach my $class (@_) {
e9bb8a31 224 # see if this is already
225 # loaded in the symbol table
f90dc7ee 226 next if _is_class_already_loaded($class);
e9bb8a31 227 # otherwise require it ...
3c2bc5e2 228 my $file = $class . '.pm';
229 $file =~ s{::}{/}g;
230 eval { CORE::require($file) };
231 confess(
f90dc7ee 232 "Could not load module '$class' because : $@"
3c2bc5e2 233 ) if $@;
234 }
e9bb8a31 235}
236
d7f17ebb 237sub _is_class_already_loaded {
238 my $name = shift;
239 no strict 'refs';
240 return 1 if defined ${"${name}::VERSION"} || defined @{"${name}::ISA"};
241 foreach (keys %{"${name}::"}) {
242 next if substr($_, -2, 2) eq '::';
243 return 1 if defined &{"${name}::$_"};
244 }
3c2bc5e2 245 return 0;
d7f17ebb 246}
247
fcd84ca9 2481;
249
250__END__
251
252=pod
253
254=head1 NAME
255
31f8ec72 256Moose - A complete modern object system for Perl 5
fcd84ca9 257
258=head1 SYNOPSIS
e522431d 259
260 package Point;
43d599e5 261 use strict;
262 use warnings;
e522431d 263 use Moose;
264
43d599e5 265 has 'x' => (is => 'rw', isa => 'Int');
266 has 'y' => (is => 'rw', isa => 'Int');
e522431d 267
268 sub clear {
269 my $self = shift;
270 $self->x(0);
271 $self->y(0);
272 }
273
274 package Point3D;
43d599e5 275 use strict;
276 use warnings;
e522431d 277 use Moose;
278
279 extends 'Point';
09fdc1dc 280
43d599e5 281 has 'z' => (is => 'rw', isa => 'Int');
e522431d 282
283 after 'clear' => sub {
284 my $self = shift;
43d599e5 285 $self->z(0);
e522431d 286 };
287
288=head1 CAVEAT
289
2c0cbef7 290Moose is a rapidly maturing module, and is already being used by
291a number of people. It's test suite is growing larger by the day,
292and the docs should soon follow.
293
294This said, Moose is not yet finished, and should still be considered
295to be evolving. Much of the outer API is stable, but the internals
296are still subject to change (although not without serious thought
297given to it).
298
fcd84ca9 299=head1 DESCRIPTION
300
e522431d 301Moose is an extension of the Perl 5 object system.
302
303=head2 Another object system!?!?
fcd84ca9 304
e522431d 305Yes, I know there has been an explosion recently of new ways to
fb82b202 306build objects in Perl 5, most of them based on inside-out objects
e522431d 307and other such things. Moose is different because it is not a new
308object system for Perl 5, but instead an extension of the existing
309object system.
3c7278fb 310
e522431d 311Moose is built on top of L<Class::MOP>, which is a metaclass system
312for Perl 5. This means that Moose not only makes building normal
505c6fac 313Perl 5 objects better, but it also provides the power of metaclass
314programming.
e522431d 315
2c0cbef7 316=head2 Can I use this in production? Or is this just an experiment?
e522431d 317
2c0cbef7 318Moose is I<based> on the prototypes and experiments I did for the Perl 6
68efb014 319meta-model; however Moose is B<NOT> an experiment/prototype, it is
43d599e5 320for B<real>. I will be deploying Moose into production environments later
68efb014 321this year, and I have every intentions of using it as my de facto class
322builder from now on.
e522431d 323
43d599e5 324=head2 Is Moose just Perl 6 in Perl 5?
e522431d 325
68efb014 326No. While Moose is very much inspired by Perl 6, it is not itself Perl 6.
327Instead, it is an OO system for Perl 5. I built Moose because I was tired or
328writing the same old boring Perl 5 OO code, and drooling over Perl 6 OO. So
329instead of switching to Ruby, I wrote Moose :)
3c7278fb 330
6ba6d68c 331=head1 BUILDING CLASSES WITH MOOSE
332
68efb014 333Moose makes every attempt to provide as much convenience as possible during
334class construction/definition, but still stay out of your way if you want it
335to. Here are a few items to note when building classes with Moose.
6ba6d68c 336
337Unless specified with C<extends>, any class which uses Moose will
338inherit from L<Moose::Object>.
339
340Moose will also manage all attributes (including inherited ones) that
68efb014 341are defined with C<has>. And assuming that you call C<new>, which is
6ba6d68c 342inherited from L<Moose::Object>, then this includes properly initializing
68efb014 343all instance slots, setting defaults where appropriate, and performing any
6ba6d68c 344type constraint checking or coercion.
345
346=head1 EXPORTED FUNCTIONS
347
68efb014 348Moose will export a number of functions into the class's namespace which
6ba6d68c 349can then be used to set up the class. These functions all work directly
350on the current class.
351
352=over 4
353
354=item B<meta>
355
356This is a method which provides access to the current class's metaclass.
357
358=item B<extends (@superclasses)>
359
360This function will set the superclass(es) for the current class.
361
362This approach is recommended instead of C<use base>, because C<use base>
363actually C<push>es onto the class's C<@ISA>, whereas C<extends> will
364replace it. This is important to ensure that classes which do not have
68efb014 365superclasses still properly inherit from L<Moose::Object>.
6ba6d68c 366
43d599e5 367=item B<with (@roles)>
e9ec68d6 368
43d599e5 369This will apply a given set of C<@roles> to the local class. Role support
68efb014 370is currently under heavy development; see L<Moose::Role> for more details.
e9ec68d6 371
6ba6d68c 372=item B<has ($name, %options)>
373
374This will install an attribute of a given C<$name> into the current class.
43d599e5 375The list of C<%options> are the same as those provided by
376L<Class::MOP::Attribute>, in addition to the list below which are provided
377by Moose (L<Moose::Meta::Attribute> to be more specific):
6ba6d68c 378
379=over 4
380
076c81ed 381=item I<is =E<gt> 'rw'|'ro'>
6ba6d68c 382
383The I<is> option accepts either I<rw> (for read/write) or I<ro> (for read
384only). These will create either a read/write accessor or a read-only
385accessor respectively, using the same name as the C<$name> of the attribute.
386
387If you need more control over how your accessors are named, you can use the
43d599e5 388I<reader>, I<writer> and I<accessor> options inherited from L<Class::MOP::Attribute>.
6ba6d68c 389
076c81ed 390=item I<isa =E<gt> $type_name>
6ba6d68c 391
392The I<isa> option uses Moose's type constraint facilities to set up runtime
393type checking for this attribute. Moose will perform the checks during class
394construction, and within any accessors. The C<$type_name> argument must be a
68efb014 395string. The string can be either a class name or a type defined using
fb82b202 396Moose's L<type definition|Moose::Util::TypeConstraints> features.
6ba6d68c 397
daea75c9 398=item I<coerce =E<gt> (1|0)>
399
fb82b202 400This will attempt to use coercion with the supplied type constraint to convert
68efb014 401the value passed into any accessors or constructors. You B<must> have supplied
daea75c9 402a type constraint in order for this to work. See L<Moose::Cookbook::Recipe5>
403for an example usage.
404
405=item I<does =E<gt> $role_name>
406
407This will accept the name of a role which the value stored in this attribute
408is expected to have consumed.
409
410=item I<required =E<gt> (1|0)>
411
412This marks the attribute as being required. This means a value must be supplied
413during class construction, and the attribute can never be set to C<undef> with
414an accessor.
415
416=item I<weak_ref =E<gt> (1|0)>
417
68efb014 418This will tell the class to store the value of this attribute as a weakened
419reference. If an attribute is a weakened reference, it B<cannot> also be
420coerced.
daea75c9 421
422=item I<lazy =E<gt> (1|0)>
423
68efb014 424This will tell the class to not create this slot until absolutely necessary.
daea75c9 425If an attribute is marked as lazy it B<must> have a default supplied.
426
9e93dd19 427=item I<auto_deref =E<gt> (1|0)>
428
68efb014 429This tells the accessor whether to automatically dereference the value returned.
9e93dd19 430This is only legal if your C<isa> option is either an C<ArrayRef> or C<HashRef>.
431
daea75c9 432=item I<trigger =E<gt> $code>
433
434The trigger option is a CODE reference which will be called after the value of
435the attribute is set. The CODE ref will be passed the instance itself, the
436updated value and the attribute meta-object (this is for more advanced fiddling
68efb014 437and can typically be ignored in most cases). You B<cannot> have a trigger on
cce8198b 438a read-only attribute.
daea75c9 439
2c0cbef7 440=item I<handles =E<gt> [ @handles ]>
441
442There is experimental support for attribute delegation using the C<handles>
443option. More docs to come later.
444
6ba6d68c 445=back
446
076c81ed 447=item B<before $name|@names =E<gt> sub { ... }>
6ba6d68c 448
076c81ed 449=item B<after $name|@names =E<gt> sub { ... }>
6ba6d68c 450
076c81ed 451=item B<around $name|@names =E<gt> sub { ... }>
6ba6d68c 452
68efb014 453This three items are syntactic sugar for the before, after, and around method
6ba6d68c 454modifier features that L<Class::MOP> provides. More information on these can
455be found in the L<Class::MOP> documentation for now.
456
159da176 457=item B<super>
458
68efb014 459The keyword C<super> is a no-op when called outside of an C<override> method. In
159da176 460the context of an C<override> method, it will call the next most appropriate
461superclass method with the same arguments as the original method.
462
463=item B<override ($name, &sub)>
464
68efb014 465An C<override> method is a way of explicitly saying "I am overriding this
159da176 466method from my superclass". You can call C<super> within this method, and
467it will work as expected. The same thing I<can> be accomplished with a normal
68efb014 468method call and the C<SUPER::> pseudo-package; it is really your choice.
159da176 469
470=item B<inner>
471
472The keyword C<inner>, much like C<super>, is a no-op outside of the context of
473an C<augment> method. You can think of C<inner> as being the inverse of
68efb014 474C<super>; the details of how C<inner> and C<augment> work is best described in
159da176 475the L<Moose::Cookbook>.
476
477=item B<augment ($name, &sub)>
478
68efb014 479An C<augment> method, is a way of explicitly saying "I am augmenting this
159da176 480method from my superclass". Once again, the details of how C<inner> and
481C<augment> work is best described in the L<Moose::Cookbook>.
482
6ba6d68c 483=item B<confess>
484
68efb014 485This is the C<Carp::confess> function, and exported here because I use it
6ba6d68c 486all the time. This feature may change in the future, so you have been warned.
487
488=item B<blessed>
489
68efb014 490This is the C<Scalar::Uti::blessed> function, it is exported here because I
6ba6d68c 491use it all the time. It is highly recommended that this is used instead of
492C<ref> anywhere you need to test for an object's class name.
493
494=back
495
31f8ec72 496=head1 UNEXPORTING FUNCTIONS
497
498=head2 B<unimport>
499
500Moose offers a way of removing the keywords it exports though the C<unimport>
501method. You simply have to say C<no Moose> at the bottom of your code for this
502to work. Here is an example:
503
504 package Person;
505 use Moose;
506
507 has 'first_name' => (is => 'rw', isa => 'Str');
508 has 'last_name' => (is => 'rw', isa => 'Str');
509
510 sub full_name {
511 my $self = shift;
512 $self->first_name . ' ' . $self->last_name
513 }
514
515 no Moose; # keywords are removed from the Person package
516
2c0cbef7 517=head1 MISC.
518
519=head2 What does Moose stand for??
520
521Moose doesn't stand for one thing in particular, however, if you
68efb014 522want, here are a few of my favorites; feel free to contribute
2c0cbef7 523more :)
524
525=over 4
526
527=item Make Other Object Systems Envious
528
529=item Makes Object Orientation So Easy
530
531=item Makes Object Orientation Spiffy- Er (sorry ingy)
532
533=item Most Other Object Systems Emasculate
534
2c0cbef7 535=item Moose Often Ovulate Sorta Early
536
2c0cbef7 537=item Moose Offers Often Super Extensions
538
539=item Meta Object Orientation Syntax Extensions
540
541=back
542
05d9eaf6 543=head1 CAVEATS
544
545=over 4
546
547=item *
548
68efb014 549It should be noted that C<super> and C<inner> C<cannot> be used in the same
550method. However, they can be combined together with the same class hierarchy;
05d9eaf6 551see F<t/014_override_augment_inner_super.t> for an example.
552
68efb014 553The reason for this is that C<super> is only valid within a method
05d9eaf6 554with the C<override> modifier, and C<inner> will never be valid within an
555C<override> method. In fact, C<augment> will skip over any C<override> methods
68efb014 556when searching for its appropriate C<inner>.
05d9eaf6 557
558This might seem like a restriction, but I am of the opinion that keeping these
68efb014 559two features separate (but interoperable) actually makes them easy to use, since
05d9eaf6 560their behavior is then easier to predict. Time will tell if I am right or not.
561
562=back
563
5569c072 564=head1 ACKNOWLEDGEMENTS
565
566=over 4
567
54c189df 568=item I blame Sam Vilain for introducing me to the insanity that is meta-models.
5569c072 569
54c189df 570=item I blame Audrey Tang for then encouraging my meta-model habit in #perl6.
5569c072 571
076c81ed 572=item Without Yuval "nothingmuch" Kogman this module would not be possible,
54c189df 573and it certainly wouldn't have this name ;P
5569c072 574
575=item The basis of the TypeContraints module was Rob Kinyon's idea
576originally, I just ran with it.
577
fb82b202 578=item Thanks to mst & chansen and the whole #moose posse for all the
d46a48f3 579ideas/feature-requests/encouragement
580
68efb014 581=item Thanks to David "Theory" Wheeler for meta-discussions and spelling fixes.
582
5569c072 583=back
584
e90c03d0 585=head1 SEE ALSO
586
587=over 4
588
6ba6d68c 589=item L<Class::MOP> documentation
590
591=item The #moose channel on irc.perl.org
592
e67a0fca 593=item The Moose mailing list - moose@perl.org
594
e90c03d0 595=item L<http://forum2.org/moose/>
596
159da176 597=item L<http://www.cs.utah.edu/plt/publications/oopsla04-gff.pdf>
598
599This paper (suggested by lbr on #moose) was what lead to the implementation
600of the C<super>/C<overrride> and C<inner>/C<augment> features. If you really
601want to understand this feature, I suggest you read this.
602
e90c03d0 603=back
604
fcd84ca9 605=head1 BUGS
606
607All complex software has bugs lurking in it, and this module is no
608exception. If you find a bug please either email me, or add the bug
609to cpan-RT.
610
fcd84ca9 611=head1 AUTHOR
612
613Stevan Little E<lt>stevan@iinteractive.comE<gt>
614
db1ab48d 615Christian Hansen E<lt>chansen@cpan.orgE<gt>
616
617Yuval Kogman E<lt>nothingmuch@woobling.orgE<gt>
98aae381 618
fcd84ca9 619=head1 COPYRIGHT AND LICENSE
620
621Copyright 2006 by Infinity Interactive, Inc.
622
623L<http://www.iinteractive.com>
624
625This library is free software; you can redistribute it and/or modify
626it under the same terms as Perl itself.
627
ddd0ec20 628=cut