kills test that wrongfully expects sqla to die with hash in joins
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Relationship / Base.pm
CommitLineData
55e2d745 1package DBIx::Class::Relationship::Base;
2
3use strict;
4use warnings;
5
1edd1722 6use base qw/DBIx::Class/;
6298a324 7
8use Scalar::Util qw/weaken blessed/;
ed7ab0f4 9use Try::Tiny;
fd323bf1 10use namespace::clean;
55e2d745 11
75d07914 12=head1 NAME
55e2d745 13
8918977e 14DBIx::Class::Relationship::Base - Inter-table relationships
55e2d745 15
16=head1 SYNOPSIS
17
18=head1 DESCRIPTION
19
30236e47 20This class provides methods to describe the relationships between the
21tables in your database model. These are the "bare bones" relationships
75d07914 22methods, for predefined ones, look in L<DBIx::Class::Relationship>.
55e2d745 23
24=head1 METHODS
25
8091aa91 26=head2 add_relationship
503536d5 27
27f01d1f 28=over 4
29
ebc77b53 30=item Arguments: 'relname', 'Foreign::Class', $cond, $attrs
27f01d1f 31
32=back
30236e47 33
503536d5 34 __PACKAGE__->add_relationship('relname', 'Foreign::Class', $cond, $attrs);
35
406734bb 36=head3 condition
37
5271499d 38The condition needs to be an L<SQL::Abstract>-style representation of the
39join between the tables. When resolving the condition for use in a C<JOIN>,
40keys using the pseudo-table C<foreign> are resolved to mean "the Table on the
41other side of the relationship", and values using the pseudo-table C<self>
30236e47 42are resolved to mean "the Table this class is representing". Other
43restrictions, such as by value, sub-select and other tables, may also be
5271499d 44used. Please check your database for C<JOIN> parameter support.
30236e47 45
5271499d 46For example, if you're creating a relationship from C<Author> to C<Book>, where
47the C<Book> table has a column C<author_id> containing the ID of the C<Author>
48row:
503536d5 49
30236e47 50 { 'foreign.author_id' => 'self.id' }
503536d5 51
5271499d 52will result in the C<JOIN> clause
503536d5 53
5271499d 54 author me JOIN book book ON book.author_id = me.id
503536d5 55
5271499d 56For multi-column foreign keys, you will need to specify a C<foreign>-to-C<self>
57mapping for each column in the key. For example, if you're creating a
58relationship from C<Book> to C<Edition>, where the C<Edition> table refers to a
59publisher and a type (e.g. "paperback"):
60
61 {
781102cd 62 'foreign.publisher_id' => 'self.publisher_id',
5271499d 63 'foreign.type_id' => 'self.type_id',
64 }
65
66This will result in the C<JOIN> clause:
67
68 book me JOIN edition edition ON edition.publisher_id = me.publisher_id
69 AND edition.type_id = me.type_id
70
71Each key-value pair provided in a hashref will be used as C<AND>ed conditions.
72To add an C<OR>ed condition, use an arrayref of hashrefs. See the
73L<SQL::Abstract> documentation for more details.
8091aa91 74
406734bb 75=head3 attributes
76
77The L<standard ResultSet attributes|DBIx::Class::ResultSet/ATTRIBUTES> may
78be used as relationship attributes. In particular, the 'where' attribute is
79useful for filtering relationships:
80
81 __PACKAGE__->has_many( 'valid_users', 'MyApp::Schema::User',
82 { 'foreign.user_id' => 'self.user_id' },
83 { where => { valid => 1 } }
84 );
85
86The following attributes are also valid:
8091aa91 87
88=over 4
89
90=item join_type
91
92Explicitly specifies the type of join to use in the relationship. Any SQL
93join type is valid, e.g. C<LEFT> or C<RIGHT>. It will be placed in the SQL
94command immediately before C<JOIN>.
95
97c96475 96=item proxy =E<gt> $column | \@columns | \%column
97
98=over 4
99
100=item \@columns
8091aa91 101
30236e47 102An arrayref containing a list of accessors in the foreign class to create in
8091aa91 103the main class. If, for example, you do the following:
d4daee7b 104
27f01d1f 105 MyDB::Schema::CD->might_have(liner_notes => 'MyDB::Schema::LinerNotes',
106 undef, {
107 proxy => [ qw/notes/ ],
108 });
d4daee7b 109
30236e47 110Then, assuming MyDB::Schema::LinerNotes has an accessor named notes, you can do:
8091aa91 111
30236e47 112 my $cd = MyDB::Schema::CD->find(1);
113 $cd->notes('Notes go here'); # set notes -- LinerNotes object is
114 # created if it doesn't exist
d4daee7b 115
97c96475 116=item \%column
117
118A hashref where each key is the accessor you want installed in the main class,
119and its value is the name of the original in the fireign class.
120
121 MyDB::Schema::Track->belongs_to( cd => 'DBICTest::Schema::CD', 'cd', {
122 proxy => { cd_title => 'title' },
123 });
124
125This will create an accessor named C<cd_title> on the C<$track> row object.
126
127=back
128
129NOTE: you can pass a nested struct too, for example:
130
131 MyDB::Schema::Track->belongs_to( cd => 'DBICTest::Schema::CD', 'cd', {
132 proxy => [ 'year', { cd_title => 'title' } ],
133 });
134
8091aa91 135=item accessor
136
137Specifies the type of accessor that should be created for the relationship.
138Valid values are C<single> (for when there is only a single related object),
139C<multi> (when there can be many), and C<filter> (for when there is a single
140related object, but you also want the relationship accessor to double as
141a column accessor). For C<multi> accessors, an add_to_* method is also
142created, which calls C<create_related> for the relationship.
143
3d618782 144=item is_foreign_key_constraint
145
146If you are using L<SQL::Translator> to create SQL for you and you find that it
fd323bf1 147is creating constraints where it shouldn't, or not creating them where it
3d618782 148should, set this attribute to a true or false value to override the detection
149of when to create constraints.
150
5f7ac523 151=item cascade_copy
152
153If C<cascade_copy> is true on a C<has_many> relationship for an
154object, then when you copy the object all the related objects will
fd323bf1 155be copied too. To turn this behaviour off, pass C<< cascade_copy => 0 >>
156in the C<$attr> hashref.
b7bbc39f 157
158The behaviour defaults to C<< cascade_copy => 1 >> for C<has_many>
159relationships.
5f7ac523 160
161=item cascade_delete
162
b7bbc39f 163By default, DBIx::Class cascades deletes across C<has_many>,
164C<has_one> and C<might_have> relationships. You can disable this
fd323bf1 165behaviour on a per-relationship basis by supplying
b7bbc39f 166C<< cascade_delete => 0 >> in the relationship attributes.
5f7ac523 167
168The cascaded operations are performed after the requested delete,
169so if your database has a constraint on the relationship, it will
170have deleted/updated the related records or raised an exception
171before DBIx::Class gets to perform the cascaded operation.
172
173=item cascade_update
174
b7bbc39f 175By default, DBIx::Class cascades updates across C<has_one> and
5f7ac523 176C<might_have> relationships. You can disable this behaviour on a
b7bbc39f 177per-relationship basis by supplying C<< cascade_update => 0 >> in
178the relationship attributes.
5f7ac523 179
cee0c9b1 180This is not a RDMS style cascade update - it purely means that when
181an object has update called on it, all the related objects also
182have update called. It will not change foreign keys automatically -
183you must arrange to do this yourself.
5f7ac523 184
e377d723 185=item on_delete / on_update
186
187If you are using L<SQL::Translator> to create SQL for you, you can use these
fd323bf1 188attributes to explicitly set the desired C<ON DELETE> or C<ON UPDATE> constraint
189type. If not supplied the SQLT parser will attempt to infer the constraint type by
e377d723 190interrogating the attributes of the B<opposite> relationship. For any 'multi'
fd323bf1 191relationship with C<< cascade_delete => 1 >>, the corresponding belongs_to
192relationship will be created with an C<ON DELETE CASCADE> constraint. For any
e377d723 193relationship bearing C<< cascade_copy => 1 >> the resulting belongs_to constraint
194will be C<ON UPDATE CASCADE>. If you wish to disable this autodetection, and just
fd323bf1 195use the RDBMS' default constraint type, pass C<< on_delete => undef >> or
e377d723 196C<< on_delete => '' >>, and the same for C<on_update> respectively.
197
13de943d 198=item is_deferrable
199
200Tells L<SQL::Translator> that the foreign key constraint it creates should be
201deferrable. In other words, the user may request that the constraint be ignored
202until the end of the transaction. Currently, only the PostgreSQL producer
203actually supports this.
204
2581038c 205=item add_fk_index
206
207Tells L<SQL::Translator> to add an index for this constraint. Can also be
208specified globally in the args to L<DBIx::Class::Schema/deploy> or
209L<DBIx::Class::Schema/create_ddl_dir>. Default is on, set to 0 to disable.
210
8091aa91 211=back
212
87c4e602 213=head2 register_relationship
214
27f01d1f 215=over 4
216
ebc77b53 217=item Arguments: $relname, $rel_info
27f01d1f 218
219=back
71e65b39 220
30236e47 221Registers a relationship on the class. This is called internally by
71f9df37 222DBIx::Class::ResultSourceProxy to set up Accessors and Proxies.
71e65b39 223
55e2d745 224=cut
225
71e65b39 226sub register_relationship { }
227
27f01d1f 228=head2 related_resultset
229
230=over 4
231
ebc77b53 232=item Arguments: $relationship_name
27f01d1f 233
d601dc88 234=item Return Value: $related_resultset
27f01d1f 235
236=back
30236e47 237
27f01d1f 238 $rs = $cd->related_resultset('artist');
30236e47 239
27f01d1f 240Returns a L<DBIx::Class::ResultSet> for the relationship named
241$relationship_name.
30236e47 242
243=cut
244
245sub related_resultset {
246 my $self = shift;
bc0c9800 247 $self->throw_exception("Can't call *_related as class methods")
248 unless ref $self;
30236e47 249 my $rel = shift;
164efde3 250 my $rel_info = $self->relationship_info($rel);
bc0c9800 251 $self->throw_exception( "No such relationship ${rel}" )
164efde3 252 unless $rel_info;
d4daee7b 253
30236e47 254 return $self->{related_resultsets}{$rel} ||= do {
255 my $attrs = (@_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {});
164efde3 256 $attrs = { %{$rel_info->{attrs} || {}}, %$attrs };
30236e47 257
bc0c9800 258 $self->throw_exception( "Invalid query: @_" )
259 if (@_ > 1 && (@_ % 2 == 1));
30236e47 260 my $query = ((@_ > 1) ? {@_} : shift);
261
68f3b0dd 262 my $source = $self->result_source;
d419ded6 263
264 # condition resolution may fail if an incomplete master-object prefetch
34b6b86f 265 # is encountered - that is ok during prefetch construction (not yet in_storage)
a126983e 266
267 # if $rel_info->{cond} is a CODE, we might need to join from the
268 # current resultsource instead of just querying the target
269 # resultsource, in that case, the condition might provide an
270 # additional condition in order to avoid an unecessary join if
271 # that is at all possible.
9aae3566 272 my ($cond, $extended_cond) = try {
52b420dd 273 $source->_resolve_condition( $rel_info->{cond}, $rel, $self )
274 }
ed7ab0f4 275 catch {
34b6b86f 276 if ($self->in_storage) {
ed7ab0f4 277 $self->throw_exception ($_);
34b6b86f 278 }
52b420dd 279
280 $DBIx::Class::ResultSource::UNRESOLVABLE_CONDITION; # RV
ed7ab0f4 281 };
d419ded6 282
68f3b0dd 283 if ($cond eq $DBIx::Class::ResultSource::UNRESOLVABLE_CONDITION) {
284 my $reverse = $source->reverse_relationship_info($rel);
285 foreach my $rev_rel (keys %$reverse) {
b82c8a28 286 if ($reverse->{$rev_rel}{attrs}{accessor} && $reverse->{$rev_rel}{attrs}{accessor} eq 'multi') {
2c5c07ec 287 $attrs->{related_objects}{$rev_rel} = [ $self ];
6298a324 288 weaken $attrs->{related_object}{$rev_rel}[0];
2c5c07ec 289 } else {
290 $attrs->{related_objects}{$rev_rel} = $self;
6298a324 291 weaken $attrs->{related_object}{$rev_rel};
2c5c07ec 292 }
68f3b0dd 293 }
294 }
9aae3566 295
296 # this is where we're going to check if we have an extended
297 # rel. In that case, we need to: 1) If there's a second
298 # condition, we use that instead. 2) If there is only one
299 # condition, we need to join the current resultsource and have
300 # additional conditions.
301 if (ref $rel_info->{cond} eq 'CODE') {
302 # this is an extended relationship.
303 if ($extended_cond) {
304 $cond = $extended_cond;
305
306 } else {
307
308 # it's a bit hard to find out what to do with other joins
309 $self->throw_exception('Extended relationship '.$rel.' with additional join requires optimized declaration')
310 if exists $attrs->{join} && $attrs->{join};
311
312 # aliases get a bit more complicated, so we won't accept additional queries
313 $self->throw_exception('Extended relationship '.$rel.' with additional query requires optimized declaration')
314 if $query;
315
316 $attrs->{from} =
317 [ { $rel => $self->result_source->from },
318 [ { 'me' => $self->result_source->related_source($rel)->from }, { 1 => 1 } ] ];
319
320 $cond->{"${rel}.${_}"} = $self->get_column($_) for $self->result_source->primary_columns;
321 }
322 }
323
30236e47 324 if (ref $cond eq 'ARRAY') {
370f2ba2 325 $cond = [ map {
326 if (ref $_ eq 'HASH') {
327 my $hash;
328 foreach my $key (keys %$_) {
47752afe 329 my $newkey = $key !~ /\./ ? "me.$key" : $key;
370f2ba2 330 $hash->{$newkey} = $_->{$key};
331 }
332 $hash;
333 } else {
334 $_;
335 }
336 } @$cond ];
68f3b0dd 337 } elsif (ref $cond eq 'HASH') {
9aae3566 338 foreach my $key (grep { ! /\./ } keys %$cond) {
339 $cond->{"me.$key"} = delete $cond->{$key};
30236e47 340 }
341 }
a126983e 342
30236e47 343 $query = ($query ? { '-and' => [ $cond, $query ] } : $cond);
bc0c9800 344 $self->result_source->related_source($rel)->resultset->search(
345 $query, $attrs
346 );
30236e47 347 };
348}
349
8091aa91 350=head2 search_related
503536d5 351
5b89a768 352 @objects = $rs->search_related('relname', $cond, $attrs);
353 $objects_rs = $rs->search_related('relname', $cond, $attrs);
30236e47 354
355Run a search on a related resultset. The search will be restricted to the
356item or items represented by the L<DBIx::Class::ResultSet> it was called
357upon. This method can be called on a ResultSet, a Row or a ResultSource class.
503536d5 358
359=cut
360
55e2d745 361sub search_related {
ff7bb7a1 362 return shift->related_resultset(shift)->search(@_);
b52e9bf8 363}
364
5b89a768 365=head2 search_related_rs
366
367 ( $objects_rs ) = $rs->search_related_rs('relname', $cond, $attrs);
368
fd323bf1 369This method works exactly the same as search_related, except that
48580715 370it guarantees a resultset, even in list context.
5b89a768 371
372=cut
373
374sub search_related_rs {
375 return shift->related_resultset(shift)->search_rs(@_);
376}
377
b52e9bf8 378=head2 count_related
379
7be93b07 380 $obj->count_related('relname', $cond, $attrs);
b52e9bf8 381
bc0c9800 382Returns the count of all the items in the related resultset, restricted by the
383current item or where conditions. Can be called on a
27f01d1f 384L<DBIx::Class::Manual::Glossary/"ResultSet"> or a
bc0c9800 385L<DBIx::Class::Manual::Glossary/"Row"> object.
30236e47 386
b52e9bf8 387=cut
388
389sub count_related {
390 my $self = shift;
391 return $self->search_related(@_)->count;
55e2d745 392}
393
30236e47 394=head2 new_related
395
396 my $new_obj = $obj->new_related('relname', \%col_data);
397
398Create a new item of the related foreign class. If called on a
fd323bf1 399L<Row|DBIx::Class::Manual::Glossary/"Row"> object, it will magically
400set any foreign key columns of the new object to the related primary
401key columns of the source object for you. The newly created item will
479b2a6a 402not be saved into your storage until you call L<DBIx::Class::Row/insert>
30236e47 403on it.
404
405=cut
406
407sub new_related {
408 my ($self, $rel, $values, $attrs) = @_;
409 return $self->search_related($rel)->new($values, $attrs);
410}
411
8091aa91 412=head2 create_related
503536d5 413
30236e47 414 my $new_obj = $obj->create_related('relname', \%col_data);
415
416Creates a new item, similarly to new_related, and also inserts the item's data
417into your storage medium. See the distinction between C<create> and C<new>
418in L<DBIx::Class::ResultSet> for details.
503536d5 419
420=cut
421
55e2d745 422sub create_related {
3842b955 423 my $self = shift;
fea3d045 424 my $rel = shift;
64acc2bc 425 my $obj = $self->search_related($rel)->create(@_);
426 delete $self->{related_resultsets}->{$rel};
427 return $obj;
55e2d745 428}
429
8091aa91 430=head2 find_related
503536d5 431
30236e47 432 my $found_item = $obj->find_related('relname', @pri_vals | \%pri_vals);
433
434Attempt to find a related object using its primary key or unique constraints.
27f01d1f 435See L<DBIx::Class::ResultSet/find> for details.
503536d5 436
437=cut
438
1a14aa3f 439sub find_related {
440 my $self = shift;
441 my $rel = shift;
716b3d29 442 return $self->search_related($rel)->find(@_);
1a14aa3f 443}
444
b3e1f1f5 445=head2 find_or_new_related
446
447 my $new_obj = $obj->find_or_new_related('relname', \%col_data);
448
449Find an item of a related class. If none exists, instantiate a new item of the
450related class. The object will not be saved into your storage until you call
451L<DBIx::Class::Row/insert> on it.
452
453=cut
454
455sub find_or_new_related {
456 my $self = shift;
e60dc79f 457 my $obj = $self->find_related(@_);
458 return defined $obj ? $obj : $self->new_related(@_);
b3e1f1f5 459}
460
8091aa91 461=head2 find_or_create_related
503536d5 462
30236e47 463 my $new_obj = $obj->find_or_create_related('relname', \%col_data);
464
27f01d1f 465Find or create an item of a related class. See
b3e1f1f5 466L<DBIx::Class::ResultSet/find_or_create> for details.
503536d5 467
468=cut
469
55e2d745 470sub find_or_create_related {
471 my $self = shift;
9c2c91ea 472 my $obj = $self->find_related(@_);
473 return (defined($obj) ? $obj : $self->create_related(@_));
55e2d745 474}
475
045120e6 476=head2 update_or_create_related
477
478 my $updated_item = $obj->update_or_create_related('relname', \%col_data, \%attrs?);
479
480Update or create an item of a related class. See
f7e1846f 481L<DBIx::Class::ResultSet/update_or_create> for details.
045120e6 482
483=cut
484
485sub update_or_create_related {
486 my $self = shift;
487 my $rel = shift;
488 return $self->related_resultset($rel)->update_or_create(@_);
489}
490
8091aa91 491=head2 set_from_related
503536d5 492
30236e47 493 $book->set_from_related('author', $author_obj);
ac8e89d7 494 $book->author($author_obj); ## same thing
30236e47 495
496Set column values on the current object, using related values from the given
497related object. This is used to associate previously separate objects, for
498example, to set the correct author for a book, find the Author object, then
499call set_from_related on the book.
500
ac8e89d7 501This is called internally when you pass existing objects as values to
48580715 502L<DBIx::Class::ResultSet/create>, or pass an object to a belongs_to accessor.
ac8e89d7 503
27f01d1f 504The columns are only set in the local copy of the object, call L</update> to
505set them in the storage.
503536d5 506
507=cut
508
55e2d745 509sub set_from_related {
510 my ($self, $rel, $f_obj) = @_;
164efde3 511 my $rel_info = $self->relationship_info($rel);
512 $self->throw_exception( "No such relationship ${rel}" ) unless $rel_info;
513 my $cond = $rel_info->{cond};
bc0c9800 514 $self->throw_exception(
515 "set_from_related can only handle a hash condition; the ".
516 "condition for $rel is of type ".
517 (ref $cond ? ref $cond : 'plain scalar')
518 ) unless ref $cond eq 'HASH';
2c037e6b 519 if (defined $f_obj) {
164efde3 520 my $f_class = $rel_info->{class};
2c037e6b 521 $self->throw_exception( "Object $f_obj isn't a ".$f_class )
6298a324 522 unless blessed $f_obj and $f_obj->isa($f_class);
2c037e6b 523 }
a126983e 524
525 # _resolve_condition might return two hashrefs, specially in the
526 # current case, since we know $f_object is an object.
527 my ($condref1, $condref2) = $self->result_source->_resolve_condition
528 ($rel_info->{cond}, $f_obj, $rel);
529
530 # if we get two condrefs, we need to use the second, otherwise we
531 # use the first.
532 $self->set_columns($condref2 ? $condref2 : $condref1);
533
55e2d745 534 return 1;
535}
536
8091aa91 537=head2 update_from_related
503536d5 538
30236e47 539 $book->update_from_related('author', $author_obj);
540
27f01d1f 541The same as L</"set_from_related">, but the changes are immediately updated
542in storage.
503536d5 543
544=cut
545
55e2d745 546sub update_from_related {
547 my $self = shift;
548 $self->set_from_related(@_);
549 $self->update;
550}
551
8091aa91 552=head2 delete_related
503536d5 553
30236e47 554 $obj->delete_related('relname', $cond, $attrs);
555
556Delete any related item subject to the given conditions.
503536d5 557
558=cut
559
55e2d745 560sub delete_related {
561 my $self = shift;
64acc2bc 562 my $obj = $self->search_related(@_)->delete;
563 delete $self->{related_resultsets}->{$_[0]};
564 return $obj;
55e2d745 565}
566
ec353f53 567=head2 add_to_$rel
568
569B<Currently only available for C<has_many>, C<many-to-many> and 'multi' type
570relationships.>
571
572=over 4
573
574=item Arguments: ($foreign_vals | $obj), $link_vals?
575
576=back
577
578 my $role = $schema->resultset('Role')->find(1);
579 $actor->add_to_roles($role);
580 # creates a My::DBIC::Schema::ActorRoles linking table row object
581
582 $actor->add_to_roles({ name => 'lead' }, { salary => 15_000_000 });
583 # creates a new My::DBIC::Schema::Role row object and the linking table
584 # object with an extra column in the link
585
586Adds a linking table object for C<$obj> or C<$foreign_vals>. If the first
587argument is a hash reference, the related object is created first with the
588column values in the hash. If an object reference is given, just the linking
589table object is created. In either case, any additional column values for the
590linking table object can be specified in C<$link_vals>.
591
592=head2 set_$rel
593
594B<Currently only available for C<many-to-many> relationships.>
595
596=over 4
597
ac36a402 598=item Arguments: (\@hashrefs | \@objs), $link_vals?
ec353f53 599
600=back
601
602 my $actor = $schema->resultset('Actor')->find(1);
fd323bf1 603 my @roles = $schema->resultset('Role')->search({ role =>
debccec3 604 { '-in' => ['Fred', 'Barney'] } } );
ec353f53 605
4d3a827d 606 $actor->set_roles(\@roles);
607 # Replaces all of $actor's previous roles with the two named
ec353f53 608
ac36a402 609 $actor->set_roles(\@roles, { salary => 15_000_000 });
610 # Sets a column in the link table for all roles
611
612
4d3a827d 613Replace all the related objects with the given reference to a list of
614objects. This does a C<delete> B<on the link table resultset> to remove the
615association between the current object and all related objects, then calls
616C<add_to_$rel> repeatedly to link all the new objects.
bba68c67 617
618Note that this means that this method will B<not> delete any objects in the
619table on the right side of the relation, merely that it will delete the link
620between them.
ec353f53 621
4d3a827d 622Due to a mistake in the original implementation of this method, it will also
623accept a list of objects or hash references. This is B<deprecated> and will be
624removed in a future version.
625
ec353f53 626=head2 remove_from_$rel
627
628B<Currently only available for C<many-to-many> relationships.>
629
630=over 4
631
632=item Arguments: $obj
633
634=back
635
636 my $role = $schema->resultset('Role')->find(1);
637 $actor->remove_from_roles($role);
638 # removes $role's My::DBIC::Schema::ActorRoles linking table row object
639
640Removes the link between the current object and the related object. Note that
641the related object itself won't be deleted unless you call ->delete() on
642it. This method just removes the link between the two objects.
643
55e2d745 644=head1 AUTHORS
645
daec44b8 646Matt S. Trout <mst@shadowcatsystems.co.uk>
55e2d745 647
648=head1 LICENSE
649
650You may distribute this code under the same terms as Perl itself.
651
652=cut
653
4d87db01 6541;