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