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