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