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