Prepare for release 0.02
[gitmo/Mouse.git] / lib / Mouse.pm
CommitLineData
c3398f5b 1#!perl
2package Mouse;
3use strict;
4use warnings;
5
f8b285d2 6our $VERSION = '0.02';
126765f0 7use 5.006;
c3398f5b 8
9use Sub::Exporter;
10use Carp 'confess';
11use Scalar::Util 'blessed';
12
306290e8 13use Mouse::Meta::Attribute;
14use Mouse::Meta::Class;
c3398f5b 15use Mouse::Object;
d60c78b9 16use Mouse::TypeRegistry;
c3398f5b 17
18do {
19 my $CALLER;
20
21 my %exports = (
22 meta => sub {
306290e8 23 my $meta = Mouse::Meta::Class->initialize($CALLER);
c3398f5b 24 return sub { $meta };
25 },
26
27 extends => sub {
28 my $caller = $CALLER;
29 return sub {
30 $caller->meta->superclasses(@_);
31 };
32 },
33
34 has => sub {
35 return sub {
36 my $package = caller;
37 my $names = shift;
38 $names = [$names] if !ref($names);
39
40 for my $name (@$names) {
306290e8 41 Mouse::Meta::Attribute->create($package, $name, @_);
c3398f5b 42 }
43 };
44 },
45
46 confess => sub {
b17094ce 47 return \&confess;
c3398f5b 48 },
49
50 blessed => sub {
b17094ce 51 return \&blessed;
c3398f5b 52 },
53 );
54
55 my $exporter = Sub::Exporter::build_exporter({
56 exports => \%exports,
57 groups => { default => [':all'] },
58 });
59
60 sub import {
61 $CALLER = caller;
62
63 strict->import;
64 warnings->import;
65
306290e8 66 my $meta = Mouse::Meta::Class->initialize($CALLER);
ca73a208 67 $meta->superclasses('Mouse::Object')
68 unless $meta->superclasses;
c3398f5b 69
70 goto $exporter;
71 }
72
73 sub unimport {
74 my $caller = caller;
75
76 no strict 'refs';
77 for my $keyword (keys %exports) {
78 next if $keyword eq 'meta'; # we don't delete this one
79 delete ${ $caller . '::' }{$keyword};
80 }
81 }
82};
83
84sub load_class {
85 my $class = shift;
262801ef 86
9694b71b 87 if (ref($class) || !defined($class) || !length($class)) {
88 my $display = defined($class) ? $class : 'undef';
89 confess "Invalid class name ($display)";
90 }
c3398f5b 91
2a674d23 92 return 1 if is_class_loaded($class);
93
c3398f5b 94 (my $file = "$class.pm") =~ s{::}{/}g;
95
96 eval { CORE::require($file) };
2a674d23 97 confess "Could not load class ($class) because : $@" if $@;
c3398f5b 98
99 return 1;
100}
101
2a674d23 102sub is_class_loaded {
103 my $class = shift;
104
7ecc2123 105 return 0 if ref($class) || !defined($class) || !length($class);
106
bf134049 107 # walk the symbol table tree to avoid autovififying
108 # \*{${main::}{"Foo::"}} == \*main::Foo::
109
110 my $pack = \*::;
111 foreach my $part (split('::', $class)) {
112 return 0 unless exists ${$$pack}{"${part}::"};
113 $pack = \*{${$$pack}{"${part}::"}};
2a674d23 114 }
bf134049 115
116 # check for $VERSION or @ISA
117 return 1 if exists ${$$pack}{VERSION}
118 && defined *{${$$pack}{VERSION}}{SCALAR};
119 return 1 if exists ${$$pack}{ISA}
120 && defined *{${$$pack}{ISA}}{ARRAY};
121
122 # check for any method
123 foreach ( keys %{$$pack} ) {
124 next if substr($_, -2, 2) eq '::';
125 return 1 if defined *{${$$pack}{$_}}{CODE};
126 }
127
128 # fail
2a674d23 129 return 0;
130}
131
c3398f5b 1321;
133
134__END__
135
136=head1 NAME
137
0fff36e6 138Mouse - Moose minus the antlers
c3398f5b 139
140=head1 VERSION
141
f8b285d2 142Version 0.02 released 11 Jun 08
c3398f5b 143
144=head1 SYNOPSIS
145
146 package Point;
6caea456 147 use Mouse; # automatically turns on strict and warnings
148
149 has 'x' => (is => 'rw', isa => 'Int');
150 has 'y' => (is => 'rw', isa => 'Int');
151
152 sub clear {
153 my $self = shift;
154 $self->x(0);
155 $self->y(0);
156 }
157
158 package Point3D;
c3398f5b 159 use Mouse;
160
6caea456 161 extends 'Point';
c3398f5b 162
6caea456 163 has 'z' => (is => 'rw', isa => 'Int');
164
0fff36e6 165 # not implemented yet :)
6caea456 166 #after 'clear' => sub {
167 # my $self = shift;
168 # $self->z(0);
169 #};
c3398f5b 170
171=head1 DESCRIPTION
172
0fff36e6 173L<Moose> is wonderful.
c3398f5b 174
0fff36e6 175Unfortunately, it's a little slow. Though significant progress has been made
176over the years, the compile time penalty is a non-starter for some
177applications.
178
179Mouse aims to alleviate this by providing a subset of Moose's
180functionality, faster. In particular, L<Moose/has> is missing only a few
181expert-level features.
182
183=head2 MOOSE COMPAT
184
185Compatibility with Moose has been the utmost concern. Fewer than 1% of the
186tests fail when run against Moose instead of Mouse. Mouse code coverage is also
8e1a28a8 187over 99%. Even the error messages are taken from Moose. The Mouse code just
188runs the test suite 3x-4x faster.
0fff36e6 189
190The idea is that, if you need the extra power, you should be able to run
8e1a28a8 191C<s/Mouse/Moose/g> on your codebase and have nothing break. To that end,
192nothingmuch has written L<Squirrel> (part of this distribution) which will act
193as Mouse unless Moose is loaded, in which case it will act as Moose.
0fff36e6 194
195Mouse also has the blessings of Moose's author, stevan.
196
197=head2 MISSING FEATURES
198
199=head3 Method modifiers
200
dca275b5 201Fixing this one next, with a reimplementation of L<Class::Method::Modifiers>.
0fff36e6 202
203=head3 Roles
204
205Fixing this one slightly less soon. stevan has suggested an implementation
206strategy. Mouse currently mostly ignores methods.
207
208=head3 Complex types
209
210User-defined type constraints and parameterized types may be implemented. Type
211coercions probably not (patches welcome).
212
213=head3 Bootstrapped meta world
214
215Very handy for extensions to the MOP. Not pressing, but would be nice to have.
216
217=head3 Modification of attribute metaclass
218
219When you declare an attribute with L</has>, you get the inlined accessors
220installed immediately. Modifying the attribute metaclass, even if possible,
221does nothing.
222
223=head3 Lots more..
224
225MouseX?
226
227=head1 KEYWORDS
c3398f5b 228
306290e8 229=head2 meta -> Mouse::Meta::Class
c3398f5b 230
231Returns this class' metaclass instance.
232
233=head2 extends superclasses
234
235Sets this class' superclasses.
236
237=head2 has (name|names) => parameters
238
239Adds an attribute (or if passed an arrayref of names, multiple attributes) to
0fff36e6 240this class. Options:
241
242=over 4
243
244=item is => ro|rw
245
246If specified, inlines a read-only/read-write accessor with the same name as
247the attribute.
248
249=item isa => TypeConstraint
250
251Provides basic type checking in the constructor and accessor. Basic types such
252as C<Int>, C<ArrayRef>, C<Defined> are supported. Any unknown type is taken to
253be a class check (e.g. isa => 'DateTime' would accept only L<DateTime>
254objects).
255
256=item required => 0|1
257
258Whether this attribute is required to have a value. If the attribute is lazy or
259has a builder, then providing a value for the attribute in the constructor is
260optional.
261
262=item init_arg => Str
263
264Allows you to use a different key name in the constructor.
265
266=item default => Value | CodeRef
267
268Sets the default value of the attribute. If the default is a coderef, it will
269be invoked to get the default value. Due to quirks of Perl, any bare reference
270is forbidden, you must wrap the reference in a coderef. Otherwise, all
271instances will share the same reference.
272
273=item lazy => 0|1
274
275If specified, the default is calculated on demand instead of in the
276constructor.
277
278=item predicate => Str
279
280Lets you specify a method name for installing a predicate method, which checks
281that the attribute has a value. It will not invoke a lazy default or builder
282method.
283
284=item clearer => Str
285
286Lets you specify a method name for installing a clearer method, which clears
287the attribute's value from the instance. On the next read, lazy or builder will
288be invoked.
289
290=item handles => HashRef|ArrayRef
291
292Lets you specify methods to delegate to the attribute. ArrayRef forwards the
293given method names to method calls on the attribute. HashRef maps local method
294names to remote method names called on the attribute. Other forms of
295L</handles>, such as regular expression and coderef, are not yet supported.
296
297=item weak_ref => 0|1
298
299Lets you automatically weaken any reference stored in the attribute.
300
301=item trigger => Coderef
302
303Any time the attribute's value is set (either through the accessor or the
304constructor), the trigger is called on it. The trigger receives as arguments
305the instance, the new value, and the attribute instance.
306
307=item builder => Str
308
309Defines a method name to be called to provide the default value of the
310attribute. C<< builder => 'build_foo' >> is mostly equivalent to
311C<< default => sub { $_[0]->build_foo } >>.
312
313=item auto_deref => 0|1
314
315Allows you to automatically dereference ArrayRef and HashRef attributes in list
316context. In scalar context, the reference is returned (NOT the list length or
317bucket status). You must specify an appropriate type constraint to use
318auto_deref.
319
320=back
c3398f5b 321
322=head2 confess error -> BOOM
323
324L<Carp/confess> for your convenience.
325
326=head2 blessed value -> ClassName | undef
327
328L<Scalar::Util/blessed> for your convenience.
329
330=head1 MISC
331
332=head2 import
333
6caea456 334Importing Mouse will default your class' superclass list to L<Mouse::Object>.
c3398f5b 335You may use L</extends> to replace the superclass list.
336
337=head2 unimport
338
0fff36e6 339Please unimport Mouse (C<no Mouse>) so that if someone calls one of the
340keywords (such as L</extends>) it will break loudly instead breaking subtly.
c3398f5b 341
342=head1 FUNCTIONS
343
344=head2 load_class Class::Name
345
6caea456 346This will load a given C<Class::Name> (or die if it's not loadable).
c3398f5b 347This function can be used in place of tricks like
348C<eval "use $module"> or using C<require>.
349
262801ef 350=head2 is_class_loaded Class::Name -> Bool
351
352Returns whether this class is actually loaded or not. It uses a heuristic which
353involves checking for the existence of C<$VERSION>, C<@ISA>, and any
354locally-defined method.
355
c3398f5b 356=head1 AUTHOR
357
358Shawn M Moore, C<< <sartak at gmail.com> >>
359
0fff36e6 360with plenty of code borrowed from L<Class::MOP> and L<Moose>
361
c3398f5b 362=head1 BUGS
363
364No known bugs.
365
366Please report any bugs through RT: email
367C<bug-mouse at rt.cpan.org>, or browse
368L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Mouse>.
369
370=head1 COPYRIGHT AND LICENSE
371
372Copyright 2008 Shawn M Moore.
373
374This program is free software; you can redistribute it and/or modify it
375under the same terms as Perl itself.
376
377=cut
378