updating
[gitmo/Moose.git] / lib / Moose.pm
CommitLineData
fcd84ca9 1
2package Moose;
3
4use strict;
5use warnings;
6
b6aed8b0 7our $VERSION = '0.02';
fcd84ca9 8
cc65ead0 9use Scalar::Util 'blessed', 'reftype';
fcd84ca9 10use Carp 'confess';
bc1e29b5 11use Sub::Name 'subname';
fcd84ca9 12
7f18097c 13use UNIVERSAL::require;
14
ef1d5f4b 15use Class::MOP;
16
c0e30cf5 17use Moose::Meta::Class;
18use Moose::Meta::Attribute;
7415b2cb 19use Moose::Meta::TypeConstraint;
7c13858b 20use Moose::Meta::TypeCoercion;
c0e30cf5 21
fcd84ca9 22use Moose::Object;
7415b2cb 23use Moose::Util::TypeConstraints;
a15dff8d 24
fcd84ca9 25sub import {
26 shift;
27 my $pkg = caller();
28
fc5609d2 29 # we should never export to main
30 return if $pkg eq 'main';
31
a15dff8d 32 Moose::Util::TypeConstraints->import($pkg);
182134e8 33
34 # make a subtype for each Moose class
7415b2cb 35 subtype $pkg
36 => as Object
37 => where { $_->isa($pkg) };
5569c072 38
fcd84ca9 39 my $meta;
40 if ($pkg->can('meta')) {
41 $meta = $pkg->meta();
42 (blessed($meta) && $meta->isa('Class::MOP::Class'))
43 || confess "Whoops, not møøsey enough";
44 }
45 else {
c0e30cf5 46 $meta = Moose::Meta::Class->initialize($pkg => (
47 ':attribute_metaclass' => 'Moose::Meta::Attribute'
e522431d 48 ));
49 $meta->add_method('meta' => sub {
50 # re-initialize so it inherits properly
51 Moose::Meta::Class->initialize($pkg => (
52 ':attribute_metaclass' => 'Moose::Meta::Attribute'
53 ));
54 })
fcd84ca9 55 }
ad1ac1bd 56
bc1e29b5 57 # NOTE:
58 # &alias_method will install the method, but it
59 # will not name it with
60
61 # handle superclasses
7f18097c 62 $meta->alias_method('extends' => subname 'Moose::extends' => sub {
63 $_->require for @_;
64 $meta->superclasses(@_)
5e030bec 65 });
505c6fac 66
c0e30cf5 67 # handle attributes
29db16a9 68 $meta->alias_method('has' => subname 'Moose::has' => sub {
69 my ($name, %options) = @_;
70 if (exists $options{is}) {
cc65ead0 71 if ($options{is} eq 'ro') {
72 $options{reader} = $name;
73 }
74 elsif ($options{is} eq 'rw') {
75 $options{accessor} = $name;
76 }
29db16a9 77 }
cc65ead0 78 if (exists $options{isa}) {
e90c03d0 79 # allow for anon-subtypes here ...
66811d63 80 if (blessed($options{isa}) && $options{isa}->isa('Moose::Meta::TypeConstraint')) {
81 $options{type_constraint} = $options{isa};
cc65ead0 82 }
83 else {
e90c03d0 84 # otherwise assume it is a constraint
7c13858b 85 my $constraint = find_type_constraint($options{isa});
e90c03d0 86 # if the constraing it not found ....
87 unless (defined $constraint) {
88 # assume it is a foreign class, and make
89 # an anon constraint for it
66811d63 90 $constraint = subtype Object => where { $_->isa($options{isa}) };
7415b2cb 91 }
e90c03d0 92 $options{type_constraint} = $constraint;
cc65ead0 93 }
29db16a9 94 }
95 $meta->add_attribute($name, %options)
96 });
3c7278fb 97
c0e30cf5 98 # handle method modifers
bc1e29b5 99 $meta->alias_method('before' => subname 'Moose::before' => sub {
e5ebe4ce 100 my $code = pop @_;
101 $meta->add_before_method_modifier($_, $code) for @_;
102 });
bc1e29b5 103 $meta->alias_method('after' => subname 'Moose::after' => sub {
e5ebe4ce 104 my $code = pop @_;
fc5609d2 105 $meta->add_after_method_modifier($_, $code) for @_;
e5ebe4ce 106 });
bc1e29b5 107 $meta->alias_method('around' => subname 'Moose::around' => sub {
c0e30cf5 108 my $code = pop @_;
fc5609d2 109 $meta->add_around_method_modifier($_, $code) for @_;
c0e30cf5 110 });
5569c072 111
c0e30cf5 112 # make sure they inherit from Moose::Object
5569c072 113 $meta->superclasses('Moose::Object')
114 unless $meta->superclasses();
ad1ac1bd 115
c0e30cf5 116 # we recommend using these things
117 # so export them for them
5569c072 118 $meta->alias_method('confess' => \&Carp::confess);
119 $meta->alias_method('blessed' => \&Scalar::Util::blessed);
fcd84ca9 120}
121
1221;
123
124__END__
125
126=pod
127
128=head1 NAME
129
e522431d 130Moose - Moose, it's the new Camel
fcd84ca9 131
132=head1 SYNOPSIS
e522431d 133
134 package Point;
135 use Moose;
136
182134e8 137 has 'x' => (isa => 'Int', is => 'rw');
138 has 'y' => (isa => 'Int', is => 'rw');
e522431d 139
140 sub clear {
141 my $self = shift;
142 $self->x(0);
143 $self->y(0);
144 }
145
146 package Point3D;
147 use Moose;
148
149 extends 'Point';
09fdc1dc 150
182134e8 151 has 'z' => (isa => 'Int');
e522431d 152
153 after 'clear' => sub {
154 my $self = shift;
155 $self->{z} = 0;
156 };
157
158=head1 CAVEAT
159
160This is a B<very> early release of this module, it still needs
161some fine tuning and B<lots> more documentation. I am adopting
162the I<release early and release often> approach with this module,
163so keep an eye on your favorite CPAN mirror!
164
fcd84ca9 165=head1 DESCRIPTION
166
e522431d 167Moose is an extension of the Perl 5 object system.
168
169=head2 Another object system!?!?
fcd84ca9 170
e522431d 171Yes, I know there has been an explosion recently of new ways to
172build object's in Perl 5, most of them based on inside-out objects,
173and other such things. Moose is different because it is not a new
174object system for Perl 5, but instead an extension of the existing
175object system.
3c7278fb 176
e522431d 177Moose is built on top of L<Class::MOP>, which is a metaclass system
178for Perl 5. This means that Moose not only makes building normal
505c6fac 179Perl 5 objects better, but it also provides the power of metaclass
180programming.
e522431d 181
182=head2 What does Moose stand for??
183
184Moose doesn't stand for one thing in particular, however, if you
185want, here are a few of my favorites, feel free to contribute
186more :)
187
188=over 4
189
5569c072 190=item Make Other Object Systems Envious
e522431d 191
192=item Makes Object Orientation So Easy
193
5569c072 194=item Makes Object Orientation Spiffy- Er (sorry ingy)
505c6fac 195
5569c072 196=item Most Other Object Systems Emasculate
505c6fac 197
198=item My Overcraft Overfilled (with) Some Eels
199
200=item Moose Often Ovulate Sorta Early
201
505c6fac 202=item Many Overloaded Object Systems Exists
203
204=item Moose Offers Often Super Extensions
205
e522431d 206=back
3c7278fb 207
6ba6d68c 208=head1 BUILDING CLASSES WITH MOOSE
209
210Moose makes every attempt to provide as much convience during class
211construction/definition, but still stay out of your way if you want
212it to. Here are some of the features Moose provides:
213
214Unless specified with C<extends>, any class which uses Moose will
215inherit from L<Moose::Object>.
216
217Moose will also manage all attributes (including inherited ones) that
218are defined with C<has>. And assuming that you call C<new> which is
219inherited from L<Moose::Object>, then this includes properly initializing
220all instance slots, setting defaults where approprtiate and performing any
221type constraint checking or coercion.
222
223=head1 EXPORTED FUNCTIONS
224
225Moose will export a number of functions into the class's namespace, which
226can then be used to set up the class. These functions all work directly
227on the current class.
228
229=over 4
230
231=item B<meta>
232
233This is a method which provides access to the current class's metaclass.
234
235=item B<extends (@superclasses)>
236
237This function will set the superclass(es) for the current class.
238
239This approach is recommended instead of C<use base>, because C<use base>
240actually C<push>es onto the class's C<@ISA>, whereas C<extends> will
241replace it. This is important to ensure that classes which do not have
242superclasses properly inherit from L<Moose::Object>.
243
244=item B<has ($name, %options)>
245
246This will install an attribute of a given C<$name> into the current class.
247The list of C<%options> are the same as those provided by both
248L<Class::MOP::Attribute> and L<Moose::Meta::Attribute>, in addition to a
249few convience ones provided by Moose which are listed below:
250
251=over 4
252
076c81ed 253=item I<is =E<gt> 'rw'|'ro'>
6ba6d68c 254
255The I<is> option accepts either I<rw> (for read/write) or I<ro> (for read
256only). These will create either a read/write accessor or a read-only
257accessor respectively, using the same name as the C<$name> of the attribute.
258
259If you need more control over how your accessors are named, you can use the
260I<reader>, I<writer> and I<accessor> options inherited from L<Moose::Meta::Attribute>.
261
076c81ed 262=item I<isa =E<gt> $type_name>
6ba6d68c 263
264The I<isa> option uses Moose's type constraint facilities to set up runtime
265type checking for this attribute. Moose will perform the checks during class
266construction, and within any accessors. The C<$type_name> argument must be a
267string. The string can be either a class name, or a type defined using
268Moose's type defintion features.
269
270=back
271
076c81ed 272=item B<before $name|@names =E<gt> sub { ... }>
6ba6d68c 273
076c81ed 274=item B<after $name|@names =E<gt> sub { ... }>
6ba6d68c 275
076c81ed 276=item B<around $name|@names =E<gt> sub { ... }>
6ba6d68c 277
278This three items are syntactic sugar for the before, after and around method
279modifier features that L<Class::MOP> provides. More information on these can
280be found in the L<Class::MOP> documentation for now.
281
282=item B<confess>
283
284This is the C<Carp::confess> function, and exported here beause I use it
285all the time. This feature may change in the future, so you have been warned.
286
287=item B<blessed>
288
289This is the C<Scalar::Uti::blessed> function, it is exported here beause I
290use it all the time. It is highly recommended that this is used instead of
291C<ref> anywhere you need to test for an object's class name.
292
293=back
294
5569c072 295=head1 ACKNOWLEDGEMENTS
296
297=over 4
298
299=item I blame Sam Vilain for giving me my first hit of meta-model crack.
300
301=item I blame Audrey Tang for encouraging that meta-crack habit in #perl6.
302
076c81ed 303=item Without Yuval "nothingmuch" Kogman this module would not be possible,
304and it would certainly have a name ;P
5569c072 305
306=item The basis of the TypeContraints module was Rob Kinyon's idea
307originally, I just ran with it.
308
076c81ed 309=item Thanks to mst & chansen and the whole #moose poose for all the
d46a48f3 310ideas/feature-requests/encouragement
311
5569c072 312=back
313
e90c03d0 314=head1 SEE ALSO
315
316=over 4
317
6ba6d68c 318=item L<Class::MOP> documentation
319
320=item The #moose channel on irc.perl.org
321
e90c03d0 322=item L<http://forum2.org/moose/>
323
324=back
325
fcd84ca9 326=head1 BUGS
327
328All complex software has bugs lurking in it, and this module is no
329exception. If you find a bug please either email me, or add the bug
330to cpan-RT.
331
fcd84ca9 332=head1 AUTHOR
333
334Stevan Little E<lt>stevan@iinteractive.comE<gt>
335
336=head1 COPYRIGHT AND LICENSE
337
338Copyright 2006 by Infinity Interactive, Inc.
339
340L<http://www.iinteractive.com>
341
342This library is free software; you can redistribute it and/or modify
343it under the same terms as Perl itself.
344
345=cut