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