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