foo
[gitmo/Moose.git] / lib / Moose.pm
CommitLineData
fcd84ca9 1
2package Moose;
3
4use strict;
5use warnings;
6
98fd1d54 7our $VERSION = '0.18';
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) }
8ecb1fa0 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 }
5cf3dbcf 218
219
fcd84ca9 220}
221
e9bb8a31 222## Utility functions
223
98fd1d54 224## TODO:
225## replace these two with the
226## Class::MOP:: versions now
227
78cd1d3b 228sub _load_all_classes {
f90dc7ee 229 foreach my $class (@_) {
e9bb8a31 230 # see if this is already
231 # loaded in the symbol table
f90dc7ee 232 next if _is_class_already_loaded($class);
e9bb8a31 233 # otherwise require it ...
3c2bc5e2 234 my $file = $class . '.pm';
235 $file =~ s{::}{/}g;
236 eval { CORE::require($file) };
237 confess(
f90dc7ee 238 "Could not load module '$class' because : $@"
3c2bc5e2 239 ) if $@;
240 }
e9bb8a31 241}
242
d7f17ebb 243sub _is_class_already_loaded {
244 my $name = shift;
245 no strict 'refs';
246 return 1 if defined ${"${name}::VERSION"} || defined @{"${name}::ISA"};
247 foreach (keys %{"${name}::"}) {
248 next if substr($_, -2, 2) eq '::';
249 return 1 if defined &{"${name}::$_"};
250 }
3c2bc5e2 251 return 0;
d7f17ebb 252}
253
8ecb1fa0 254## make 'em all immutable
255
256$_->meta->make_immutable(
257 inline_constructor => 0,
258 inline_accessors => 0,
259) for (
260 'Moose::Meta::Attribute',
261 'Moose::Meta::Class',
262 'Moose::Meta::Instance',
263
264 'Moose::Meta::TypeConstraint',
265 'Moose::Meta::TypeConstraint::Union',
266 'Moose::Meta::TypeCoercion',
267
268 'Moose::Meta::Method',
269 'Moose::Meta::Method::Accessor',
270 'Moose::Meta::Method::Constructor',
271 'Moose::Meta::Method::Overriden',
272);
273
fcd84ca9 2741;
275
276__END__
277
278=pod
279
280=head1 NAME
281
31f8ec72 282Moose - A complete modern object system for Perl 5
fcd84ca9 283
284=head1 SYNOPSIS
e522431d 285
286 package Point;
43d599e5 287 use strict;
288 use warnings;
e522431d 289 use Moose;
290
43d599e5 291 has 'x' => (is => 'rw', isa => 'Int');
292 has 'y' => (is => 'rw', isa => 'Int');
e522431d 293
294 sub clear {
295 my $self = shift;
296 $self->x(0);
297 $self->y(0);
298 }
299
300 package Point3D;
43d599e5 301 use strict;
302 use warnings;
e522431d 303 use Moose;
304
305 extends 'Point';
09fdc1dc 306
43d599e5 307 has 'z' => (is => 'rw', isa => 'Int');
e522431d 308
309 after 'clear' => sub {
310 my $self = shift;
43d599e5 311 $self->z(0);
e522431d 312 };
313
314=head1 CAVEAT
315
2c0cbef7 316Moose is a rapidly maturing module, and is already being used by
317a number of people. It's test suite is growing larger by the day,
318and the docs should soon follow.
319
320This said, Moose is not yet finished, and should still be considered
321to be evolving. Much of the outer API is stable, but the internals
322are still subject to change (although not without serious thought
323given to it).
324
fcd84ca9 325=head1 DESCRIPTION
326
e522431d 327Moose is an extension of the Perl 5 object system.
328
329=head2 Another object system!?!?
fcd84ca9 330
e522431d 331Yes, I know there has been an explosion recently of new ways to
68efb014 332build object's in Perl 5, most of them based on inside-out objects
e522431d 333and other such things. Moose is different because it is not a new
334object system for Perl 5, but instead an extension of the existing
335object system.
3c7278fb 336
e522431d 337Moose is built on top of L<Class::MOP>, which is a metaclass system
338for Perl 5. This means that Moose not only makes building normal
505c6fac 339Perl 5 objects better, but it also provides the power of metaclass
340programming.
e522431d 341
2c0cbef7 342=head2 Can I use this in production? Or is this just an experiment?
e522431d 343
2c0cbef7 344Moose is I<based> on the prototypes and experiments I did for the Perl 6
68efb014 345meta-model; however Moose is B<NOT> an experiment/prototype, it is
43d599e5 346for B<real>. I will be deploying Moose into production environments later
68efb014 347this year, and I have every intentions of using it as my de facto class
348builder from now on.
e522431d 349
43d599e5 350=head2 Is Moose just Perl 6 in Perl 5?
e522431d 351
68efb014 352No. While Moose is very much inspired by Perl 6, it is not itself Perl 6.
353Instead, it is an OO system for Perl 5. I built Moose because I was tired or
354writing the same old boring Perl 5 OO code, and drooling over Perl 6 OO. So
355instead of switching to Ruby, I wrote Moose :)
3c7278fb 356
6ba6d68c 357=head1 BUILDING CLASSES WITH MOOSE
358
68efb014 359Moose makes every attempt to provide as much convenience as possible during
360class construction/definition, but still stay out of your way if you want it
361to. Here are a few items to note when building classes with Moose.
6ba6d68c 362
363Unless specified with C<extends>, any class which uses Moose will
364inherit from L<Moose::Object>.
365
366Moose will also manage all attributes (including inherited ones) that
68efb014 367are defined with C<has>. And assuming that you call C<new>, which is
6ba6d68c 368inherited from L<Moose::Object>, then this includes properly initializing
68efb014 369all instance slots, setting defaults where appropriate, and performing any
6ba6d68c 370type constraint checking or coercion.
371
372=head1 EXPORTED FUNCTIONS
373
68efb014 374Moose will export a number of functions into the class's namespace which
6ba6d68c 375can then be used to set up the class. These functions all work directly
376on the current class.
377
378=over 4
379
380=item B<meta>
381
382This is a method which provides access to the current class's metaclass.
383
384=item B<extends (@superclasses)>
385
386This function will set the superclass(es) for the current class.
387
388This approach is recommended instead of C<use base>, because C<use base>
389actually C<push>es onto the class's C<@ISA>, whereas C<extends> will
390replace it. This is important to ensure that classes which do not have
68efb014 391superclasses still properly inherit from L<Moose::Object>.
6ba6d68c 392
43d599e5 393=item B<with (@roles)>
e9ec68d6 394
43d599e5 395This will apply a given set of C<@roles> to the local class. Role support
68efb014 396is currently under heavy development; see L<Moose::Role> for more details.
e9ec68d6 397
6ba6d68c 398=item B<has ($name, %options)>
399
400This will install an attribute of a given C<$name> into the current class.
43d599e5 401The list of C<%options> are the same as those provided by
402L<Class::MOP::Attribute>, in addition to the list below which are provided
403by Moose (L<Moose::Meta::Attribute> to be more specific):
6ba6d68c 404
405=over 4
406
076c81ed 407=item I<is =E<gt> 'rw'|'ro'>
6ba6d68c 408
409The I<is> option accepts either I<rw> (for read/write) or I<ro> (for read
410only). These will create either a read/write accessor or a read-only
411accessor respectively, using the same name as the C<$name> of the attribute.
412
413If you need more control over how your accessors are named, you can use the
43d599e5 414I<reader>, I<writer> and I<accessor> options inherited from L<Class::MOP::Attribute>.
6ba6d68c 415
076c81ed 416=item I<isa =E<gt> $type_name>
6ba6d68c 417
418The I<isa> option uses Moose's type constraint facilities to set up runtime
419type checking for this attribute. Moose will perform the checks during class
420construction, and within any accessors. The C<$type_name> argument must be a
68efb014 421string. The string can be either a class name or a type defined using
422Moose's type definition features.
6ba6d68c 423
daea75c9 424=item I<coerce =E<gt> (1|0)>
425
426This will attempt to use coercion with the supplied type constraint to change
68efb014 427the value passed into any accessors or constructors. You B<must> have supplied
daea75c9 428a type constraint in order for this to work. See L<Moose::Cookbook::Recipe5>
429for an example usage.
430
431=item I<does =E<gt> $role_name>
432
433This will accept the name of a role which the value stored in this attribute
434is expected to have consumed.
435
436=item I<required =E<gt> (1|0)>
437
438This marks the attribute as being required. This means a value must be supplied
439during class construction, and the attribute can never be set to C<undef> with
440an accessor.
441
442=item I<weak_ref =E<gt> (1|0)>
443
68efb014 444This will tell the class to store the value of this attribute as a weakened
445reference. If an attribute is a weakened reference, it B<cannot> also be
446coerced.
daea75c9 447
448=item I<lazy =E<gt> (1|0)>
449
68efb014 450This will tell the class to not create this slot until absolutely necessary.
daea75c9 451If an attribute is marked as lazy it B<must> have a default supplied.
452
9e93dd19 453=item I<auto_deref =E<gt> (1|0)>
454
68efb014 455This tells the accessor whether to automatically dereference the value returned.
9e93dd19 456This is only legal if your C<isa> option is either an C<ArrayRef> or C<HashRef>.
457
daea75c9 458=item I<trigger =E<gt> $code>
459
460The trigger option is a CODE reference which will be called after the value of
461the attribute is set. The CODE ref will be passed the instance itself, the
462updated value and the attribute meta-object (this is for more advanced fiddling
68efb014 463and can typically be ignored in most cases). You B<cannot> have a trigger on
cce8198b 464a read-only attribute.
daea75c9 465
2c0cbef7 466=item I<handles =E<gt> [ @handles ]>
467
468There is experimental support for attribute delegation using the C<handles>
469option. More docs to come later.
470
6ba6d68c 471=back
472
076c81ed 473=item B<before $name|@names =E<gt> sub { ... }>
6ba6d68c 474
076c81ed 475=item B<after $name|@names =E<gt> sub { ... }>
6ba6d68c 476
076c81ed 477=item B<around $name|@names =E<gt> sub { ... }>
6ba6d68c 478
68efb014 479This three items are syntactic sugar for the before, after, and around method
6ba6d68c 480modifier features that L<Class::MOP> provides. More information on these can
481be found in the L<Class::MOP> documentation for now.
482
159da176 483=item B<super>
484
68efb014 485The keyword C<super> is a no-op when called outside of an C<override> method. In
159da176 486the context of an C<override> method, it will call the next most appropriate
487superclass method with the same arguments as the original method.
488
489=item B<override ($name, &sub)>
490
68efb014 491An C<override> method is a way of explicitly saying "I am overriding this
159da176 492method from my superclass". You can call C<super> within this method, and
493it will work as expected. The same thing I<can> be accomplished with a normal
68efb014 494method call and the C<SUPER::> pseudo-package; it is really your choice.
159da176 495
496=item B<inner>
497
498The keyword C<inner>, much like C<super>, is a no-op outside of the context of
499an C<augment> method. You can think of C<inner> as being the inverse of
68efb014 500C<super>; the details of how C<inner> and C<augment> work is best described in
159da176 501the L<Moose::Cookbook>.
502
503=item B<augment ($name, &sub)>
504
68efb014 505An C<augment> method, is a way of explicitly saying "I am augmenting this
159da176 506method from my superclass". Once again, the details of how C<inner> and
507C<augment> work is best described in the L<Moose::Cookbook>.
508
6ba6d68c 509=item B<confess>
510
68efb014 511This is the C<Carp::confess> function, and exported here because I use it
6ba6d68c 512all the time. This feature may change in the future, so you have been warned.
513
514=item B<blessed>
515
68efb014 516This is the C<Scalar::Uti::blessed> function, it is exported here because I
6ba6d68c 517use it all the time. It is highly recommended that this is used instead of
518C<ref> anywhere you need to test for an object's class name.
519
520=back
521
31f8ec72 522=head1 UNEXPORTING FUNCTIONS
523
524=head2 B<unimport>
525
526Moose offers a way of removing the keywords it exports though the C<unimport>
527method. You simply have to say C<no Moose> at the bottom of your code for this
528to work. Here is an example:
529
530 package Person;
531 use Moose;
532
533 has 'first_name' => (is => 'rw', isa => 'Str');
534 has 'last_name' => (is => 'rw', isa => 'Str');
535
536 sub full_name {
537 my $self = shift;
538 $self->first_name . ' ' . $self->last_name
539 }
540
541 no Moose; # keywords are removed from the Person package
542
2c0cbef7 543=head1 MISC.
544
545=head2 What does Moose stand for??
546
547Moose doesn't stand for one thing in particular, however, if you
68efb014 548want, here are a few of my favorites; feel free to contribute
2c0cbef7 549more :)
550
551=over 4
552
553=item Make Other Object Systems Envious
554
555=item Makes Object Orientation So Easy
556
557=item Makes Object Orientation Spiffy- Er (sorry ingy)
558
559=item Most Other Object Systems Emasculate
560
2c0cbef7 561=item Moose Often Ovulate Sorta Early
562
2c0cbef7 563=item Moose Offers Often Super Extensions
564
565=item Meta Object Orientation Syntax Extensions
566
567=back
568
05d9eaf6 569=head1 CAVEATS
570
571=over 4
572
573=item *
574
68efb014 575It should be noted that C<super> and C<inner> C<cannot> be used in the same
576method. However, they can be combined together with the same class hierarchy;
05d9eaf6 577see F<t/014_override_augment_inner_super.t> for an example.
578
68efb014 579The reason for this is that C<super> is only valid within a method
05d9eaf6 580with the C<override> modifier, and C<inner> will never be valid within an
581C<override> method. In fact, C<augment> will skip over any C<override> methods
68efb014 582when searching for its appropriate C<inner>.
05d9eaf6 583
584This might seem like a restriction, but I am of the opinion that keeping these
68efb014 585two features separate (but interoperable) actually makes them easy to use, since
05d9eaf6 586their behavior is then easier to predict. Time will tell if I am right or not.
587
588=back
589
5569c072 590=head1 ACKNOWLEDGEMENTS
591
592=over 4
593
54c189df 594=item I blame Sam Vilain for introducing me to the insanity that is meta-models.
5569c072 595
54c189df 596=item I blame Audrey Tang for then encouraging my meta-model habit in #perl6.
5569c072 597
076c81ed 598=item Without Yuval "nothingmuch" Kogman this module would not be possible,
54c189df 599and it certainly wouldn't have this name ;P
5569c072 600
601=item The basis of the TypeContraints module was Rob Kinyon's idea
602originally, I just ran with it.
603
076c81ed 604=item Thanks to mst & chansen and the whole #moose poose for all the
d46a48f3 605ideas/feature-requests/encouragement
606
68efb014 607=item Thanks to David "Theory" Wheeler for meta-discussions and spelling fixes.
608
5569c072 609=back
610
e90c03d0 611=head1 SEE ALSO
612
613=over 4
614
6ba6d68c 615=item L<Class::MOP> documentation
616
617=item The #moose channel on irc.perl.org
618
e67a0fca 619=item The Moose mailing list - moose@perl.org
620
e90c03d0 621=item L<http://forum2.org/moose/>
622
159da176 623=item L<http://www.cs.utah.edu/plt/publications/oopsla04-gff.pdf>
624
625This paper (suggested by lbr on #moose) was what lead to the implementation
626of the C<super>/C<overrride> and C<inner>/C<augment> features. If you really
627want to understand this feature, I suggest you read this.
628
e90c03d0 629=back
630
fcd84ca9 631=head1 BUGS
632
633All complex software has bugs lurking in it, and this module is no
634exception. If you find a bug please either email me, or add the bug
635to cpan-RT.
636
fcd84ca9 637=head1 AUTHOR
638
639Stevan Little E<lt>stevan@iinteractive.comE<gt>
640
db1ab48d 641Christian Hansen E<lt>chansen@cpan.orgE<gt>
642
643Yuval Kogman E<lt>nothingmuch@woobling.orgE<gt>
98aae381 644
fcd84ca9 645=head1 COPYRIGHT AND LICENSE
646
b77fdbed 647Copyright 2006, 2007 by Infinity Interactive, Inc.
fcd84ca9 648
649L<http://www.iinteractive.com>
650
651This library is free software; you can redistribute it and/or modify
652it under the same terms as Perl itself.
653
ddd0ec20 654=cut