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