0d58601185b72408da7130d56c556a5e32449961
[gitmo/Moose.git] / lib / Moose.pm
1
2 package Moose;
3
4 use strict;
5 use warnings;
6
7 our $VERSION   = '0.20';
8 our $AUTHORITY = 'cpan:STEVAN';
9
10 use Scalar::Util 'blessed', 'reftype';
11 use Carp         'confess';
12 use Sub::Name    'subname';
13 use B            'svref_2object';
14
15 use Sub::Exporter;
16
17 use Class::MOP;
18
19 use Moose::Meta::Class;
20 use Moose::Meta::TypeConstraint;
21 use Moose::Meta::TypeCoercion;
22 use Moose::Meta::Attribute;
23 use Moose::Meta::Instance;
24
25 use Moose::Object;
26 use Moose::Util::TypeConstraints;
27
28 {
29     my $CALLER;
30
31     sub _init_meta {
32         my $class = $CALLER;
33
34         # make a subtype for each Moose class
35         subtype $class
36             => as 'Object'
37             => where { $_->isa($class) }
38             => optimize_as { blessed($_[0]) && $_[0]->isa($class) }
39         unless find_type_constraint($class);
40
41         my $meta;
42         if ($class->can('meta')) {
43             # NOTE:
44             # this is the case where the metaclass pragma 
45             # was used before the 'use Moose' statement to 
46             # override a specific class
47             $meta = $class->meta();
48             (blessed($meta) && $meta->isa('Moose::Meta::Class'))
49                 || confess "You already have a &meta function, but it does not return a Moose::Meta::Class";
50         }
51         else {
52             # NOTE:
53             # this is broken currently, we actually need 
54             # to allow the possiblity of an inherited 
55             # meta, which will not be visible until the 
56             # user 'extends' first. This needs to have 
57             # more intelligence to it 
58             $meta = Moose::Meta::Class->initialize($class);
59             $meta->add_method('meta' => sub {
60                 # re-initialize so it inherits properly
61                 Moose::Meta::Class->initialize(blessed($_[0]) || $_[0]);
62             })
63         }
64
65         # make sure they inherit from Moose::Object
66         $meta->superclasses('Moose::Object')
67            unless $meta->superclasses();
68     }
69
70     my %exports = (
71         extends => sub {
72             my $class = $CALLER;
73             return subname 'Moose::extends' => sub (@) {
74                 confess "Must derive at least one class" unless @_;
75                 Class::MOP::load_class($_) for @_;
76                 # this checks the metaclass to make sure 
77                 # it is correct, sometimes it can get out 
78                 # of sync when the classes are being built
79                 my $meta = $class->meta->_fix_metaclass_incompatability(@_);
80                 $meta->superclasses(@_);
81             };
82         },
83         with => sub {
84             my $class = $CALLER;
85             return subname 'Moose::with' => sub (@) {
86                 my (@roles) = @_;
87                 confess "Must specify at least one role" unless @roles;
88                 Class::MOP::load_class($_) for @roles;
89                 $class->meta->_apply_all_roles(@roles);
90             };
91         },
92         has => sub {
93             my $class = $CALLER;
94             return subname 'Moose::has' => sub ($;%) {
95                 my ($name, %options) = @_;
96                 my $attrs = (ref($name) eq 'ARRAY') ? $name : [($name)];
97                 $class->meta->_process_attribute($_, %options) for @$attrs;
98             };
99         },
100         before => sub {
101             my $class = $CALLER;
102             return subname 'Moose::before' => sub (@&) {
103                 my $code = pop @_;
104                 my $meta = $class->meta;
105                 $meta->add_before_method_modifier($_, $code) for @_;
106             };
107         },
108         after => sub {
109             my $class = $CALLER;
110             return subname 'Moose::after' => sub (@&) {
111                 my $code = pop @_;
112                 my $meta = $class->meta;
113                 $meta->add_after_method_modifier($_, $code) for @_;
114             };
115         },
116         around => sub {
117             my $class = $CALLER;            
118             return subname 'Moose::around' => sub (@&) {
119                 my $code = pop @_;
120                 my $meta = $class->meta;
121                 $meta->add_around_method_modifier($_, $code) for @_;
122             };
123         },
124         super => sub {
125             return subname 'Moose::super' => sub {};
126         },
127         override => sub {
128             my $class = $CALLER;
129             return subname 'Moose::override' => sub ($&) {
130                 my ($name, $method) = @_;
131                 $class->meta->add_override_method_modifier($name => $method);
132             };
133         },
134         inner => sub {
135             return subname 'Moose::inner' => sub {};
136         },
137         augment => sub {
138             my $class = $CALLER;
139             return subname 'Moose::augment' => sub (@&) {
140                 my ($name, $method) = @_;
141                 $class->meta->add_augment_method_modifier($name => $method);
142             };
143         },
144         
145         # NOTE:
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         # },                
169         
170         confess => sub {
171             return \&Carp::confess;
172         },
173         blessed => sub {
174             return \&Scalar::Util::blessed;
175         },
176     );
177
178     my $exporter = Sub::Exporter::build_exporter({ 
179         exports => \%exports,
180         groups  => {
181             default => [':all']
182         }
183     });
184     
185     sub import {     
186         $CALLER = caller();
187         
188         strict->import;
189         warnings->import;        
190
191         # we should never export to main
192         return if $CALLER eq 'main';
193     
194         _init_meta();
195         
196         goto $exporter;
197     }
198     
199     sub unimport {
200         no strict 'refs';        
201         my $class = caller();
202         # loop through the exports ...
203         foreach my $name (keys %exports) {
204             next if $name =~ /inner|super|self/;
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     }
220     
221     
222 }
223
224 ## make 'em all immutable
225
226 $_->meta->make_immutable(
227     inline_constructor => 0,
228     inline_accessors   => 0,    
229 ) for (
230     'Moose::Meta::Attribute',
231     'Moose::Meta::Class',
232     'Moose::Meta::Instance',
233
234     'Moose::Meta::TypeConstraint',
235     'Moose::Meta::TypeConstraint::Union',
236     'Moose::Meta::TypeCoercion',
237
238     'Moose::Meta::Method',
239     'Moose::Meta::Method::Accessor',
240     'Moose::Meta::Method::Constructor',
241     'Moose::Meta::Method::Overriden',
242 );
243
244 1;
245
246 __END__
247
248 =pod
249
250 =head1 NAME
251
252 Moose - A complete modern object system for Perl 5
253
254 =head1 SYNOPSIS
255
256   package Point;
257   use strict;
258   use warnings;
259   use Moose;
260         
261   has 'x' => (is => 'rw', isa => 'Int');
262   has 'y' => (is => 'rw', isa => 'Int');
263   
264   sub clear {
265       my $self = shift;
266       $self->x(0);
267       $self->y(0);    
268   }
269   
270   package Point3D;
271   use strict;
272   use warnings;  
273   use Moose;
274   
275   extends 'Point';
276   
277   has 'z' => (is => 'rw', isa => 'Int');
278   
279   after 'clear' => sub {
280       my $self = shift;
281       $self->z(0);
282   }; 
283
284 =head1 DESCRIPTION
285
286 Moose is an extension of the Perl 5 object system. 
287
288 =head2 Another object system!?!?
289
290 Yes, I know there has been an explosion recently of new ways to 
291 build object's in Perl 5, most of them based on inside-out objects
292 and other such things. Moose is different because it is not a new 
293 object system for Perl 5, but instead an extension of the existing 
294 object system.
295
296 Moose is built on top of L<Class::MOP>, which is a metaclass system 
297 for Perl 5. This means that Moose not only makes building normal 
298 Perl 5 objects better, but it also provides the power of metaclass 
299 programming.
300
301 =head2 Is this for real? Or is this just an experiment?
302
303 Moose is I<based> on the prototypes and experiments I did for the Perl 6
304 meta-model; however Moose is B<NOT> an experiment/prototype, it is 
305 for B<real>. 
306
307 =head2 Is this ready for use in production? 
308
309 Yes, I believe that it is. 
310
311 I have two medium-to-large-ish web applications which use Moose heavily
312 and have been in production (without issue) for several months now. At 
313 $work, we are re-writing our core offering in it. And several people on 
314 #moose have been using it (in production) for several months now as well.
315
316 Of course, in the end, you need to make this call yourself. If you have 
317 any questions or concerns, please feel free to email me, or even the list 
318 or just stop by #moose and ask away.
319
320 =head2 Is Moose just Perl 6 in Perl 5?
321
322 No. While Moose is very much inspired by Perl 6, it is not itself Perl 6.
323 Instead, it is an OO system for Perl 5. I built Moose because I was tired or
324 writing the same old boring Perl 5 OO code, and drooling over Perl 6 OO. So
325 instead of switching to Ruby, I wrote Moose :)
326
327 =head1 BUILDING CLASSES WITH MOOSE
328
329 Moose makes every attempt to provide as much convenience as possible during
330 class construction/definition, but still stay out of your way if you want it
331 to. Here are a few items to note when building classes with Moose.
332
333 Unless specified with C<extends>, any class which uses Moose will 
334 inherit from L<Moose::Object>.
335
336 Moose will also manage all attributes (including inherited ones) that 
337 are defined with C<has>. And assuming that you call C<new>, which is 
338 inherited from L<Moose::Object>, then this includes properly initializing 
339 all instance slots, setting defaults where appropriate, and performing any 
340 type constraint checking or coercion. 
341
342 =head1 EXPORTED FUNCTIONS
343
344 Moose will export a number of functions into the class's namespace which 
345 can then be used to set up the class. These functions all work directly 
346 on the current class.
347
348 =over 4
349
350 =item B<meta>
351
352 This is a method which provides access to the current class's metaclass.
353
354 =item B<extends (@superclasses)>
355
356 This function will set the superclass(es) for the current class.
357
358 This approach is recommended instead of C<use base>, because C<use base> 
359 actually C<push>es onto the class's C<@ISA>, whereas C<extends> will 
360 replace it. This is important to ensure that classes which do not have 
361 superclasses still properly inherit from L<Moose::Object>.
362
363 =item B<with (@roles)>
364
365 This will apply a given set of C<@roles> to the local class. Role support 
366 is currently under heavy development; see L<Moose::Role> for more details.
367
368 =item B<has $name =E<gt> %options>
369
370 This will install an attribute of a given C<$name> into the current class. 
371 The list of C<%options> are the same as those provided by 
372 L<Class::MOP::Attribute>, in addition to the list below which are provided 
373 by Moose (L<Moose::Meta::Attribute> to be more specific):
374
375 =over 4
376
377 =item I<is =E<gt> 'rw'|'ro'>
378
379 The I<is> option accepts either I<rw> (for read/write) or I<ro> (for read 
380 only). These will create either a read/write accessor or a read-only 
381 accessor respectively, using the same name as the C<$name> of the attribute.
382
383 If you need more control over how your accessors are named, you can use the 
384 I<reader>, I<writer> and I<accessor> options inherited from L<Class::MOP::Attribute>.
385
386 =item I<isa =E<gt> $type_name>
387
388 The I<isa> option uses Moose's type constraint facilities to set up runtime 
389 type checking for this attribute. Moose will perform the checks during class 
390 construction, and within any accessors. The C<$type_name> argument must be a 
391 string. The string can be either a class name or a type defined using 
392 Moose's type definition features.
393
394 =item I<coerce =E<gt> (1|0)>
395
396 This will attempt to use coercion with the supplied type constraint to change 
397 the value passed into any accessors or constructors. You B<must> have supplied 
398 a type constraint in order for this to work. See L<Moose::Cookbook::Recipe5>
399 for an example usage.
400
401 =item I<does =E<gt> $role_name>
402
403 This will accept the name of a role which the value stored in this attribute 
404 is expected to have consumed.
405
406 =item I<required =E<gt> (1|0)>
407
408 This marks the attribute as being required. This means a value must be supplied 
409 during class construction, and the attribute can never be set to C<undef> with 
410 an accessor. 
411
412 =item I<weak_ref =E<gt> (1|0)>
413
414 This will tell the class to store the value of this attribute as a weakened
415 reference. If an attribute is a weakened reference, it B<cannot> also be
416 coerced.
417
418 =item I<lazy =E<gt> (1|0)>
419
420 This will tell the class to not create this slot until absolutely necessary. 
421 If an attribute is marked as lazy it B<must> have a default supplied.
422
423 =item I<auto_deref =E<gt> (1|0)>
424
425 This tells the accessor whether to automatically dereference the value returned. 
426 This is only legal if your C<isa> option is either an C<ArrayRef> or C<HashRef>.
427
428 =item I<metaclass =E<gt> $metaclass_name>
429
430 This tells the class to use a custom attribute metaclass for this particular 
431 attribute. Custom attribute metaclasses are useful for extending the capabilities 
432 of the I<has> keyword, they are the simplest way to extend the MOP, but they are 
433 still a fairly advanced topic and too much to cover here. I will try and write a 
434 recipe on it soon.
435
436 The default behavior here is to just load C<$metaclass_name>, however, we also 
437 have a way to alias to a shorter name. This will first look to see if 
438 B<Moose::Meta::Attribute::Custom::$metaclass_name> exists, if it does it will 
439 then check to see if that has the method C<register_implemenetation> which 
440 should return the actual name of the custom attribute metaclass. If there is 
441 no C<register_implemenetation> method, it will just default to using 
442 B<Moose::Meta::Attribute::Custom::$metaclass_name> as the metaclass name.
443
444 =item I<trigger =E<gt> $code>
445
446 The trigger option is a CODE reference which will be called after the value of 
447 the attribute is set. The CODE ref will be passed the instance itself, the 
448 updated value and the attribute meta-object (this is for more advanced fiddling
449 and can typically be ignored in most cases). You B<cannot> have a trigger on
450 a read-only attribute.
451
452 =item I<handles =E<gt> ARRAY | HASH | REGEXP | CODE>
453
454 The handles option provides Moose classes with automated delegation features. 
455 This is a pretty complex and powerful option, it accepts many different option 
456 formats, each with it's own benefits and drawbacks. 
457
458 B<NOTE:> This features is no longer experimental, but it still may have subtle 
459 bugs lurking in the deeper corners. So if you think you have found a bug, you 
460 probably have, so please report it to me right away. 
461
462 B<NOTE:> The class being delegated to does not need to be a Moose based class. 
463 Which is why this feature is especially useful when wrapping non-Moose classes.
464
465 All handles option formats share the following traits. 
466
467 You cannot override a locally defined method with a delegated method, an 
468 exception will be thrown if you try. Meaning, if you define C<foo> in your 
469 class, you cannot override it with a delegated C<foo>. This is almost never 
470 something you would want to do, and if it is, you should do it by hand and 
471 not use Moose.
472
473 You cannot override any of the methods found in Moose::Object as well as 
474 C<BUILD> or C<DEMOLISH> methods. These will not throw an exception, but will 
475 silently move on to the next method in the list. My reasoning for this is that 
476 you would almost never want to do this because it usually tends to break your 
477 class. And as with overriding locally defined methods, if you do want to do this, 
478 you should do it manually and not with Moose.
479
480 Below is the documentation for each option format:
481
482 =over 4
483
484 =item C<ARRAY>
485
486 This is the most common usage for handles. You basically pass a list of 
487 method names to be delegated, and Moose will install a delegation method 
488 for each one in the list.
489
490 =item C<HASH>
491
492 This is the second most common usage for handles. Instead of a list of 
493 method names, you pass a HASH ref where the key is the method name you 
494 want installed locally, and the value is the name of the original method 
495 in the class being delegated too. 
496
497 This can be very useful for recursive classes like trees, here is a 
498 quick example (soon to be expanded into a Moose::Cookbook::Recipe):
499
500   pacakge Tree;
501   use Moose;
502   
503   has 'node' => (is => 'rw', isa => 'Any');
504   
505   has 'children' => (
506       is      => 'ro',
507       isa     => 'ArrayRef',
508       default => sub { [] }
509   );
510   
511   has 'parent' => (
512       is          => 'rw',
513       isa         => 'Tree',
514       is_weak_ref => 1,
515       handles     => {
516           parent_node => 'node',
517           siblings    => 'children', 
518       }
519   );
520
521 In this example, the Tree package gets the C<parent_node> and C<siblings> methods
522 which delegate to the C<node> and C<children> methods of the Tree instance stored 
523 in the parent slot. 
524
525 =item C<REGEXP>
526
527 The regexp option works very similar to the ARRAY option, except that it builds 
528 the list of methods for you. It starts by collecting all possible methods of the 
529 class being delegated too, then filters that list using the regexp supplied here. 
530
531 B<NOTE:> An I<isa> option is required when using the regexp option format. This 
532 is so that we can determine (at compile time) the method list from the class. 
533 Without an I<isa> this is just not possible.
534
535 =item C<CODE>
536
537 This is the option to use when you really want to do something funky. You should 
538 only use it if you really know what you are doing as it involves manual metaclass
539 twiddling.
540
541 This takes a code reference, which should expect two arguments. The first is 
542 the attribute meta-object this I<handles> is attached too. The second is the metaclass
543 of the class being delegated too. It expects you to return a hash (not a HASH ref)
544 of the methods you want mapped. 
545
546 =back
547
548 =back
549
550 =item B<has +$name =E<gt> %options>
551
552 This is variation on the normal attibute creator C<has>, which allows you to 
553 clone and extend an attribute from a superclass. Here is a quick example:
554
555   package Foo;
556   use Moose;
557   
558   has 'message' => (
559       is      => 'rw', 
560       isa     => 'Str',
561       default => 'Hello, I am a Foo'
562   );
563   
564   package My::Foo;
565   use Moose;
566   
567   extends 'Foo';
568   
569   has '+message' => (default => 'Hello I am My::Foo');
570
571 What is happening here is that B<My::Foo> is cloning the C<message> attribute 
572 from it's parent class B<Foo>, retaining the is =E<gt> 'rw' and isa =E<gt> 'Str'
573 characteristics, but changing the value in C<default>.
574
575 This feature is restricted somewhat, so as to try and enfore at least I<some>
576 sanity into it. You are only allowed to change the following attributes:
577
578 =over 4
579
580 =item I<default> 
581
582 Change the default value of an attribute.
583
584 =item I<coerce> 
585
586 Change whether the attribute attempts to coerce a value passed to it.
587
588 =item I<required> 
589
590 Change if the attribute is required to have a value.
591
592 =item I<documentation>
593
594 Change the documentation string associated with the attribute.
595
596 =item I<isa>
597
598 You I<are> allowed to change the type, but if and B<only if> the new type is
599 a subtype of the old type.  
600
601 =back
602
603 =item B<before $name|@names =E<gt> sub { ... }>
604
605 =item B<after $name|@names =E<gt> sub { ... }>
606
607 =item B<around $name|@names =E<gt> sub { ... }>
608
609 This three items are syntactic sugar for the before, after, and around method 
610 modifier features that L<Class::MOP> provides. More information on these can 
611 be found in the L<Class::MOP> documentation for now. 
612
613 =item B<super>
614
615 The keyword C<super> is a no-op when called outside of an C<override> method. In  
616 the context of an C<override> method, it will call the next most appropriate 
617 superclass method with the same arguments as the original method.
618
619 =item B<override ($name, &sub)>
620
621 An C<override> method is a way of explicitly saying "I am overriding this 
622 method from my superclass". You can call C<super> within this method, and 
623 it will work as expected. The same thing I<can> be accomplished with a normal 
624 method call and the C<SUPER::> pseudo-package; it is really your choice. 
625
626 =item B<inner>
627
628 The keyword C<inner>, much like C<super>, is a no-op outside of the context of 
629 an C<augment> method. You can think of C<inner> as being the inverse of 
630 C<super>; the details of how C<inner> and C<augment> work is best described in
631 the L<Moose::Cookbook>.
632
633 =item B<augment ($name, &sub)>
634
635 An C<augment> method, is a way of explicitly saying "I am augmenting this 
636 method from my superclass". Once again, the details of how C<inner> and 
637 C<augment> work is best described in the L<Moose::Cookbook>.
638
639 =item B<confess>
640
641 This is the C<Carp::confess> function, and exported here because I use it
642 all the time. This feature may change in the future, so you have been warned. 
643
644 =item B<blessed>
645
646 This is the C<Scalar::Uti::blessed> function, it is exported here because I
647 use it all the time. It is highly recommended that this is used instead of 
648 C<ref> anywhere you need to test for an object's class name.
649
650 =back
651
652 =head1 UNEXPORTING FUNCTIONS
653
654 =head2 B<unimport>
655
656 Moose offers a way of removing the keywords it exports though the C<unimport>
657 method. You simply have to say C<no Moose> at the bottom of your code for this
658 to work. Here is an example:
659
660     package Person;
661     use Moose;
662
663     has 'first_name' => (is => 'rw', isa => 'Str');
664     has 'last_name'  => (is => 'rw', isa => 'Str');
665     
666     sub full_name { 
667         my $self = shift;
668         $self->first_name . ' ' . $self->last_name 
669     }
670     
671     no Moose; # keywords are removed from the Person package    
672
673 =head1 MISC.
674
675 =head2 What does Moose stand for??
676
677 Moose doesn't stand for one thing in particular, however, if you 
678 want, here are a few of my favorites; feel free to contribute
679 more :)
680
681 =over 4
682
683 =item Make Other Object Systems Envious
684
685 =item Makes Object Orientation So Easy
686
687 =item Makes Object Orientation Spiffy- Er  (sorry ingy)
688
689 =item Most Other Object Systems Emasculate
690
691 =item Moose Often Ovulate Sorta Early
692
693 =item Moose Offers Often Super Extensions
694
695 =item Meta Object Orientation Syntax Extensions
696
697 =back
698
699 =head1 CAVEATS
700
701 =over 4
702
703 =item *
704
705 It should be noted that C<super> and C<inner> C<cannot> be used in the same 
706 method. However, they can be combined together with the same class hierarchy;
707 see F<t/014_override_augment_inner_super.t> for an example. 
708
709 The reason for this is that C<super> is only valid within a method 
710 with the C<override> modifier, and C<inner> will never be valid within an 
711 C<override> method. In fact, C<augment> will skip over any C<override> methods 
712 when searching for its appropriate C<inner>.
713
714 This might seem like a restriction, but I am of the opinion that keeping these 
715 two features separate (but interoperable) actually makes them easy to use, since 
716 their behavior is then easier to predict. Time will tell if I am right or not.
717
718 =back
719
720 =head1 ACKNOWLEDGEMENTS
721
722 =over 4
723
724 =item I blame Sam Vilain for introducing me to the insanity that is meta-models.
725
726 =item I blame Audrey Tang for then encouraging my meta-model habit in #perl6.
727
728 =item Without Yuval "nothingmuch" Kogman this module would not be possible, 
729 and it certainly wouldn't have this name ;P
730
731 =item The basis of the TypeContraints module was Rob Kinyon's idea 
732 originally, I just ran with it.
733
734 =item Thanks to mst & chansen and the whole #moose poose for all the 
735 ideas/feature-requests/encouragement/bug-finding.
736
737 =item Thanks to David "Theory" Wheeler for meta-discussions and spelling fixes.
738
739 =back
740
741 =head1 SEE ALSO
742
743 =over 4
744
745 =item L<Class::MOP> documentation
746
747 =item The #moose channel on irc.perl.org
748
749 =item The Moose mailing list - moose@perl.org
750
751 =item L<http://forum2.org/moose/>
752
753 =item L<http://www.cs.utah.edu/plt/publications/oopsla04-gff.pdf>
754
755 This paper (suggested by lbr on #moose) was what lead to the implementation 
756 of the C<super>/C<overrride> and C<inner>/C<augment> features. If you really 
757 want to understand this feature, I suggest you read this.
758
759 =back
760
761 =head1 BUGS
762
763 All complex software has bugs lurking in it, and this module is no 
764 exception. If you find a bug please either email me, or add the bug
765 to cpan-RT.
766
767 =head1 AUTHOR
768
769 Stevan Little E<lt>stevan@iinteractive.comE<gt>
770
771 Christian Hansen E<lt>chansen@cpan.orgE<gt>
772
773 Yuval Kogman E<lt>nothingmuch@woobling.orgE<gt>
774
775 =head1 COPYRIGHT AND LICENSE
776
777 Copyright 2006, 2007 by Infinity Interactive, Inc.
778
779 L<http://www.iinteractive.com>
780
781 This library is free software; you can redistribute it and/or modify
782 it under the same terms as Perl itself. 
783
784 =cut