Fix and guard against erroneous use of list context in internal DBIC code
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class.pm
CommitLineData
ea2e61bf 1package DBIx::Class;
2
5d283305 3use strict;
4use warnings;
5
f9cc85ce 6our $VERSION;
7# Always remember to do all digits for the version even if they're 0
8# i.e. first release of 0.XX *must* be 0.XX000. This avoids fBSD ports
9# brain damage and presumably various other packaging systems too
10
11# $VERSION declaration must stay up here, ahead of any other package
12# declarations, as to not confuse various modules attempting to determine
13# this ones version, whether that be s.c.o. or Module::Metadata, etc
c36f8d8d 14$VERSION = '0.08250';
f9cc85ce 15
16$VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases
17
87bf71d5 18BEGIN {
6cefa7ab 19 package # hide from pause
20 DBIx::Class::_ENV_;
e0b2dc74 21
0d8817bc 22 use Config;
4bea1fe7 23
0d8817bc 24 use constant {
e0b2dc74 25
0d8817bc 26 # but of course
27 BROKEN_FORK => ($^O eq 'MSWin32') ? 1 : 0,
b4ad8a74 28
0d8817bc 29 HAS_ITHREADS => $Config{useithreads} ? 1 : 0,
e0b2dc74 30
0d8817bc 31 # ::Runmode would only be loaded by DBICTest, which in turn implies t/
32 DBICTEST => eval { DBICTest::RunMode->is_author } ? 1 : 0,
e0b2dc74 33
0d8817bc 34 # During 5.13 dev cycle HELEMs started to leak on copy
35 PEEPEENESS =>
36 # request for all tests would force "non-leaky" illusion and vice-versa
37 defined $ENV{DBICTEST_ALL_LEAKS} ? !$ENV{DBICTEST_ALL_LEAKS}
38 # otherwise confess that this perl is busted ONLY on smokers
39 : eval { DBICTest::RunMode->is_smoker } && ($] >= 5.013005 and $] <= 5.013006) ? 1
40 # otherwise we are good
41 : 0
42 ,
a9da9b6a 43
44 ASSERT_NO_INTERNAL_WANTARRAY => $ENV{DBIC_ASSERT_NO_INTERNAL_WANTARRAY} ? 1 : 0,
0d8817bc 45 };
b4ad8a74 46
0d8817bc 47 if ($] < 5.009_005) {
48 require MRO::Compat;
49 constant->import( OLD_MRO => 1 );
50 }
51 else {
52 require mro;
53 constant->import( OLD_MRO => 0 );
54 }
87bf71d5 55}
56
d38cd95c 57use mro 'c3';
329d7385 58
2527233b 59use DBIx::Class::Optional::Dependencies;
60
db29433c 61use base qw/DBIx::Class::Componentised DBIx::Class::AccessorGroup/;
11736b4c 62use DBIx::Class::StartupCheck;
f9080e45 63use DBIx::Class::Exception;
3e110410 64
70c28808 65__PACKAGE__->mk_group_accessors(inherited => '_skip_namespace_frames');
9345b14c 66__PACKAGE__->_skip_namespace_frames('^DBIx::Class|^SQL::Abstract|^Try::Tiny|^Class::Accessor::Grouped|^Context::Preserve');
70c28808 67
ade0fe3b 68sub mk_classdata {
77d518d1 69 shift->mk_classaccessor(@_);
70}
71
72sub mk_classaccessor {
73 my $self = shift;
ade0fe3b 74 $self->mk_group_accessors('inherited', $_[0]);
77d518d1 75 $self->set_inherited(@_) if @_ > 1;
3e110410 76}
3c0068c1 77
7411204b 78sub component_base_class { 'DBIx::Class' }
227d4dee 79
f0750722 80sub MODIFY_CODE_ATTRIBUTES {
b5d2c57f 81 my ($class,$code,@attrs) = @_;
82 $class->mk_classdata('__attr_cache' => {})
83 unless $class->can('__attr_cache');
84 $class->__attr_cache->{$code} = [@attrs];
85 return ();
f0750722 86}
87
da95b45f 88sub _attr_cache {
b5d2c57f 89 my $self = shift;
90 my $cache = $self->can('__attr_cache') ? $self->__attr_cache : {};
9780718f 91
92 return {
93 %$cache,
94 %{ $self->maybe::next::method || {} },
20674fcd 95 };
da95b45f 96}
97
ea2e61bf 981;
34d52be2 99
97ad6fb8 100__END__
101
102=encoding UTF-8
103
75d07914 104=head1 NAME
34d52be2 105
7e4b2f59 106DBIx::Class - Extensible and flexible object <-> relational mapper.
34d52be2 107
06752a03 108=head1 WHERE TO START READING
3b1c2bbd 109
06752a03 110See L<DBIx::Class::Manual::DocMap> for an overview of the exhaustive documentation.
111To get the most out of DBIx::Class with the least confusion it is strongly
112recommended to read (at the very least) the
113L<Manuals|DBIx::Class::Manual::DocMap/Manuals> in the order presented there.
114
115=head1 HOW TO GET HELP
116
117Due to the complexity of its problem domain, DBIx::Class is a relatively
118complex framework. After you start using DBIx::Class questions will inevitably
119arise. If you are stuck with a problem or have doubts about a particular
120approach do not hesitate to contact the community with your questions. The
121list below is sorted by "fastest response time":
3b1c2bbd 122
a06e1181 123=over
3b1c2bbd 124
c6fdaf2a 125=item * IRC: irc.perl.org#dbix-class
126
127=for html
e1ddfc8a 128<a href="https://chat.mibbit.com/#dbix-class@irc.perl.org">(click for instant chatroom login)</a>
3b1c2bbd 129
a06e1181 130=item * Mailing list: L<http://lists.scsys.co.uk/mailman/listinfo/dbix-class>
3b1c2bbd 131
e1ddfc8a 132=item * RT Bug Tracker: L<https://rt.cpan.org/NoAuth/Bugs.html?Dist=DBIx-Class>
86a23587 133
e1ddfc8a 134=item * Twitter: L<https://www.twitter.com/dbix_class>
86a23587 135
86a23587 136=item * Web Site: L<http://www.dbix-class.org/>
a06e1181 137
86a23587 138=back
139
34d52be2 140=head1 SYNOPSIS
141
113e8d16 142For the very impatient: L<DBIx::Class::Manual::QuickStart>
143
144This code in the next step can be generated automatically from an existing
145database, see L<dbicdump> from the distribution C<DBIx-Class-Schema-Loader>.
146
5b56d1ac 147=head2 Schema classes preparation
148
53aa53f3 149Create a schema class called F<MyApp/Schema.pm>:
34d52be2 150
03460bef 151 package MyApp::Schema;
a0638a7b 152 use base qw/DBIx::Class::Schema/;
34d52be2 153
f0bb26f3 154 __PACKAGE__->load_namespaces();
daec44b8 155
a0638a7b 156 1;
daec44b8 157
30e1753a 158Create a result class to represent artists, who have many CDs, in
53aa53f3 159F<MyApp/Schema/Result/Artist.pm>:
daec44b8 160
30e1753a 161See L<DBIx::Class::ResultSource> for docs on defining result classes.
162
03460bef 163 package MyApp::Schema::Result::Artist;
d88ecca6 164 use base qw/DBIx::Class::Core/;
daec44b8 165
a0638a7b 166 __PACKAGE__->table('artist');
167 __PACKAGE__->add_columns(qw/ artistid name /);
168 __PACKAGE__->set_primary_key('artistid');
326dacbf 169 __PACKAGE__->has_many(cds => 'MyApp::Schema::Result::CD', 'artistid');
daec44b8 170
a0638a7b 171 1;
daec44b8 172
30e1753a 173A result class to represent a CD, which belongs to an artist, in
53aa53f3 174F<MyApp/Schema/Result/CD.pm>:
39fe0e65 175
03460bef 176 package MyApp::Schema::Result::CD;
d88ecca6 177 use base qw/DBIx::Class::Core/;
39fe0e65 178
d88ecca6 179 __PACKAGE__->load_components(qw/InflateColumn::DateTime/);
a0638a7b 180 __PACKAGE__->table('cd');
bd077b47 181 __PACKAGE__->add_columns(qw/ cdid artistid title year /);
a0638a7b 182 __PACKAGE__->set_primary_key('cdid');
03460bef 183 __PACKAGE__->belongs_to(artist => 'MyApp::Schema::Result::Artist', 'artistid');
39fe0e65 184
a0638a7b 185 1;
39fe0e65 186
5b56d1ac 187=head2 API usage
188
a0638a7b 189Then you can use these classes in your application's code:
39fe0e65 190
a0638a7b 191 # Connect to your database.
03460bef 192 use MyApp::Schema;
193 my $schema = MyApp::Schema->connect($dbi_dsn, $user, $pass, \%dbi_params);
a0638a7b 194
195 # Query for all artists and put them in an array,
196 # or retrieve them as a result set object.
30e1753a 197 # $schema->resultset returns a DBIx::Class::ResultSet
2053ab2a 198 my @all_artists = $schema->resultset('Artist')->all;
199 my $all_artists_rs = $schema->resultset('Artist');
126042ee 200
30e1753a 201 # Output all artists names
4e8ffded 202 # $artist here is a DBIx::Class::Row, which has accessors
16ccb4fe 203 # for all its columns. Rows are also subclasses of your Result class.
85067746 204 foreach $artist (@all_artists) {
30e1753a 205 print $artist->name, "\n";
206 }
207
a0638a7b 208 # Create a result set to search for artists.
86beca1d 209 # This does not query the DB.
2053ab2a 210 my $johns_rs = $schema->resultset('Artist')->search(
6576ef54 211 # Build your WHERE using an SQL::Abstract structure:
2053ab2a 212 { name => { like => 'John%' } }
a0638a7b 213 );
39fe0e65 214
2053ab2a 215 # Execute a joined query to get the cds.
a0638a7b 216 my @all_john_cds = $johns_rs->search_related('cds')->all;
448c8424 217
f0bb26f3 218 # Fetch the next available row.
a0638a7b 219 my $first_john = $johns_rs->next;
448c8424 220
2053ab2a 221 # Specify ORDER BY on the query.
a0638a7b 222 my $first_john_cds_by_title_rs = $first_john->cds(
223 undef,
224 { order_by => 'title' }
225 );
448c8424 226
bd077b47 227 # Create a result set that will fetch the artist data
2053ab2a 228 # at the same time as it fetches CDs, using only one query.
884559b1 229 my $millennium_cds_rs = $schema->resultset('CD')->search(
a0638a7b 230 { year => 2000 },
231 { prefetch => 'artist' }
232 );
448c8424 233
880a1a0c 234 my $cd = $millennium_cds_rs->next; # SELECT ... FROM cds JOIN artists ...
bd077b47 235 my $cd_artist_name = $cd->artist->name; # Already has the data so no 2nd query
076652e8 236
fb13a49f 237 # new() makes a Result object but doesnt insert it into the DB.
264f1571 238 # create() is the same as new() then insert().
884559b1 239 my $new_cd = $schema->resultset('CD')->new({ title => 'Spoon' });
f183eccd 240 $new_cd->artist($cd->artist);
f183eccd 241 $new_cd->insert; # Auto-increment primary key filled in after INSERT
f183eccd 242 $new_cd->title('Fork');
243
884559b1 244 $schema->txn_do(sub { $new_cd->update }); # Runs the update in a transaction
f183eccd 245
bd077b47 246 # change the year of all the millennium CDs at once
247 $millennium_cds_rs->update({ year => 2002 });
f183eccd 248
249=head1 DESCRIPTION
250
251This is an SQL to OO mapper with an object API inspired by L<Class::DBI>
bd077b47 252(with a compatibility layer as a springboard for porting) and a resultset API
f183eccd 253that allows abstract encapsulation of database operations. It aims to make
254representing queries in your code as perl-ish as possible while still
a0638a7b 255providing access to as many of the capabilities of the database as possible,
f183eccd 256including retrieving related records from multiple tables in a single query,
53aa53f3 257C<JOIN>, C<LEFT JOIN>, C<COUNT>, C<DISTINCT>, C<GROUP BY>, C<ORDER BY> and
258C<HAVING> support.
f183eccd 259
260DBIx::Class can handle multi-column primary and foreign keys, complex
261queries and database-level paging, and does its best to only query the
75d07914 262database in order to return something you've directly asked for. If a
263resultset is used as an iterator it only fetches rows off the statement
264handle as requested in order to minimise memory usage. It has auto-increment
2053ab2a 265support for SQLite, MySQL, PostgreSQL, Oracle, SQL Server and DB2 and is
266known to be used in production on at least the first four, and is fork-
ec6415a9 267and thread-safe out of the box (although
9361b05d 268L<your DBD may not be|DBI/Threads and Thread Safety>).
f183eccd 269
dfccde48 270This project is still under rapid development, so large new features may be
53aa53f3 271marked B<experimental> - such APIs are still usable but may have edge bugs.
272Failing test cases are I<always> welcome and point releases are put out rapidly
dfccde48 273as bugs are found and fixed.
274
275We do our best to maintain full backwards compatibility for published
276APIs, since DBIx::Class is used in production in many organisations,
277and even backwards incompatible changes to non-published APIs will be fixed
278if they're reported and doing so doesn't cost the codebase anything.
279
264f1571 280The test suite is quite substantial, and several developer releases
281are generally made to CPAN before the branch for the next release is
282merged back to trunk for a major release.
f183eccd 283
6ed05cfd 284=head1 HOW TO CONTRIBUTE
285
286Contributions are always welcome, in all usable forms (we especially
287welcome documentation improvements). The delivery methods include git-
288or unified-diff formatted patches, GitHub pull requests, or plain bug
289reports either via RT or the Mailing list. Contributors are generally
290granted full access to the official repository after their first patch
291passes successful review.
292
293=for comment
294FIXME: Getty, frew and jnap need to get off their asses and finish the contrib section so we can link it here ;)
295
296This project is maintained in a git repository. The code and related tools are
297accessible at the following locations:
298
299=over
300
301=item * Official repo: L<git://git.shadowcat.co.uk/dbsrgits/DBIx-Class.git>
302
303=item * Official gitweb: L<http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits/DBIx-Class.git>
304
305=item * GitHub mirror: L<https://github.com/dbsrgits/DBIx-Class>
306
307=item * Authorized committers: L<ssh://dbsrgits@git.shadowcat.co.uk/DBIx-Class.git>
308
309=item * Travis-CI log: L<https://travis-ci.org/dbsrgits/dbix-class/builds>
310
311=for html
312&#x21AA; Stable branch CI status: <img src="https://secure.travis-ci.org/dbsrgits/dbix-class.png?branch=master"></img>
313
314=back
315
3942ab4d 316=head1 AUTHOR
34d52be2 317
266bdcc3 318mst: Matt S. Trout <mst@shadowcatsystems.co.uk>
34d52be2 319
dfccde48 320(I mostly consider myself "project founder" these days but the AUTHOR heading
321is traditional :)
322
3942ab4d 323=head1 CONTRIBUTORS
324
907ed671 325abraxxa: Alexander Hartmaier <abraxxa@cpan.org>
84e3c114 326
fd4b0742 327acca: Alexander Kuznetsov <acca@cpan.org>
328
6d84db2c 329aherzog: Adam Herzog <adam@herzogdesigns.com>
330
daeb1865 331Alexander Keusch <cpan@keusch.at>
332
c3de6b51 333alexrj: Alessandro Ranellucci <aar@cpan.org>
334
630ba6e5 335alnewkirk: Al Newkirk <we@ana.im>
336
6ebf5cbb 337amiri: Amiri Barksdale <amiri@metalabel.com>
338
b703fec7 339amoore: Andrew Moore <amoore@cpan.org>
340
913b4bae 341andrewalker: Andre Walker <andre@andrewalker.net>
342
266bdcc3 343andyg: Andy Grundman <andy@hybridized.org>
3942ab4d 344
266bdcc3 345ank: Andres Kievsky
3942ab4d 346
59ac6523 347arc: Aaron Crane <arc@cpan.org>
348
624764ae 349arcanez: Justin Hunter <justin.d.hunter@gmail.com>
350
ce4c07df 351ash: Ash Berlin <ash@cpan.org>
352
f8213ab0 353bert: Norbert Csongrádi <bert@cpan.org>
3d5bd2af 354
967a4c40 355blblack: Brandon L. Black <blblack@gmail.com>
3942ab4d 356
62eb8fe8 357bluefeet: Aran Deltac <bluefeet@cpan.org>
358
d6170b26 359bphillips: Brian Phillips <bphillips@cpan.org>
360
f856fe01 361boghead: Bryan Beeley <cpan@beeley.org>
362
23d9df41 363brd: Brad Davis <brd@FreeBSD.org>
364
bcb8f3ed 365bricas: Brian Cassidy <bricas@cpan.org>
366
3d7e3e05 367brunov: Bruno Vecchi <vecchi.b@gmail.com>
368
281719d2 369caelum: Rafael Kitover <rkitover@cpan.org>
370
f5f2af8f 371caldrin: Maik Hentsche <maik.hentsche@amd.com>
372
d3b0e369 373castaway: Jess Robinson
3942ab4d 374
266bdcc3 375claco: Christopher H. Laco
ccb9c9b1 376
266bdcc3 377clkao: CL Kao
3942ab4d 378
e21dfd6a 379da5id: David Jack Olrik <djo@cpan.org>
18360aed 380
11343b34 381dariusj: Darius Jokilehto <dariusjokilehto@yahoo.co.uk>
382
5f7ff3f0 383davewood: David Schmidt <davewood@gmx.at>
384
97ad6fb8 385daxim: Lars Dɪᴇᴄᴋᴏᴡ 迪拉斯 <daxim@cpan.org>
386
13de943d 387debolaz: Anders Nor Berle <berle@cpan.org>
388
d1f542db 389dew: Dan Thomas <dan@godders.org>
390
266bdcc3 391dkubb: Dan Kubb <dan.kubb-cpan@onautopilot.com>
ccb9c9b1 392
9382ad07 393dnm: Justin Wheeler <jwheeler@datademons.com>
394
0818c9a7 395dpetrov: Dimitar Petrov <mitakaa@gmail.com>
396
266bdcc3 397dwc: Daniel Westermann-Clark <danieltwc@cpan.org>
4685e006 398
5cffe785 399dyfrgi: Michael Leuchtenburg <michael@slashhome.org>
8fe164b9 400
7b71391b 401edenc: Eden Cardim <edencardim@gmail.com>
402
bfcecabc 403ether: Karen Etheridge <ether@cpan.org>
404
307f1265 405felliott: Fitz Elliott <fitz.elliott@gmail.com>
406
0ffada27 407freetime: Bill Moseley <moseley@hank.org>
408
ade0fe3b 409frew: Arthur Axel "fREW" Schmidt <frioux@gmail.com>
410
b4987ed0 411goraxe: Gordon Irving <goraxe@cpan.org>
412
d3b0e369 413gphat: Cory G Watson <gphat@cpan.org>
ad3d2d7c 414
61f031bf 415Grant Street Group L<http://www.grantstreet.com/>
416
e758ffe6 417groditi: Guillermo Roditi <groditi@cpan.org>
418
6dad89f5 419Haarg: Graham Knop <haarg@haarg.org>
420
157ce0cf 421hobbs: Andrew Rodland <arodland@cpan.org>
422
5d779578 423ilmari: Dagfinn Ilmari MannsE<aring>ker <ilmari@ilmari.org>
424
0ac0af6c 425initself: Mike Baas <mike@initselftech.com>
426
2bb4c37b 427ironcamel: Naveed Massjouni <naveedm9@gmail.com>
428
f165eda8 429jawnsy: Jonathan Yu <jawnsy@cpan.org>
430
bee21976 431jasonmay: Jason May <jason.a.may@gmail.com>
432
d3b0e369 433jesper: Jesper Krogh
5fb0c64c 434
4a743a00 435jgoulah: John Goulah <jgoulah@cpan.org>
436
102a2984 437jguenther: Justin Guenther <jguenther@cpan.org>
d7c4c15c 438
a14a46e2 439jhannah: Jay Hannah <jay@jays.net>
440
dffda3a2 441jmac: Jason McIntosh <jmac@appleseed-sc.com>
442
8b93a938 443jnapiorkowski: John Napiorkowski <jjn1056@yahoo.com>
444
11736b4c 445jon: Jon Schutz <jjschutz@cpan.org>
446
1aec4bac 447jshirley: J. Shirley <jshirley@gmail.com>
448
41519379 449kaare: Kaare Rasmussen
450
d3b0e369 451konobi: Scott McWhirter
535fc2ee 452
4e0a89e4 453littlesavage: Alexey Illarionov <littlesavage@orionet.ru>
454
4367679a 455lukes: Luke Saunders <luke.saunders@gmail.com>
456
709ea492 457marcus: Marcus Ramberg <mramberg@cpan.org>
458
114780ee 459mattlaw: Matt Lawrence
460
45bffdf0 461mattp: Matt Phillips <mattp@cpan.org>
462
58755bba 463michaelr: Michael Reddick <michael.reddick@gmail.com>
464
91d0c99f 465milki: Jonathan Chu <milki@rescomp.berkeley.edu>
466
b81d8515 467mithaldu: Christian Walde <walde.christian@gmail.com>
468
582fe49d 469mjemmeson: Michael Jemmeson <michael.jemmeson@gmail.com>
470
167e7634 471mstratman: Mark A. Stratman <stratman@gmail.com>
472
77e7e47d 473ned: Neil de Carteret
474
266bdcc3 475nigel: Nigel Metheringham <nigelm@cpan.org>
6565b410 476
d3b0e369 477ningu: David Kamholz <dkamholz@cpan.org>
478
66cf3a84 479Nniuq: Ron "Quinn" Straight" <quinnfazigu@gmail.org>
480
20b4c148 481norbi: Norbert Buchmuller <norbi@nix.hu>
482
48580715 483nuba: Nuba Princigalli <nuba@cpan.org>
484
d3b0e369 485Numa: Dan Sully <daniel@cpan.org>
486
dc571b76 487ovid: Curtis "Ovid" Poe <ovid@cpan.org>
488
6c30f9c3 489oyse: E<Oslash>ystein Torget <oystein.torget@dnv.com>
bf356c54 490
266bdcc3 491paulm: Paul Makepeace
4763f4b7 492
d3b0e369 493penguin: K J Cheetham
494
8cfef6f5 495perigrin: Chris Prather <chris@prather.org>
496
14899528 497peter: Peter Collingbourne <peter@pcc.me.uk>
caac1708 498
f8213ab0 499Peter Siklósi <einon@einon.hu>
500
6c30f9c3 501Peter Valdemar ME<oslash>rch <peter@morch.com>
502
266bdcc3 503phaylon: Robert Sedlacek <phaylon@dunkelheit.at>
a53b95f1 504
56fadd8f 505plu: Johannes Plunien <plu@cpan.org>
506
0c1a4a15 507Possum: Daniel LeWarne <possum@cpan.org>
508
d3b0e369 509quicksilver: Jules Bean
022e0893 510
4ed01b34 511rafl: Florian Ragwitz <rafl@debian.org>
512
0c1a4a15 513rainboxx: Matthias Dietrich <perl@rb.ly>
514
868a7b26 515rbo: Robert Bohne <rbo@cpan.org>
516
7ff0dace 517rbuels: Robert Buels <rmb32@cornell.edu>
518
0da8b7da 519rdj: Ryan D Johnson <ryan@innerfence.com>
520
66b1e361 521ribasushi: Peter Rabbitson <ribasushi@cpan.org>
d76e282a 522
b487918c 523rjbs: Ricardo Signes <rjbs@cpan.org>
524
6ffb5be5 525robkinyon: Rob Kinyon <rkinyon@cpan.org>
526
726c8f65 527Robert Olson <bob@rdolson.org>
528
a93441f2 529moltar: Roman Filippov <romanf@cpan.org>
e4c9f3f0 530
dc81dba3 531Sadrak: Felix Antonius Wilhelm Ostmann <sadrak@cpan.org>
532
d3b0e369 533sc_: Just Another Perl Hacker
ba606e58 534
266bdcc3 535scotty: Scotty Allen <scotty@scottyallen.com>
181a28f4 536
1c133e22 537semifor: Marc Mims <marc@questright.com>
538
16667b3a 539SineSwiper: Brendan Byrd <bbyrd@cpan.org>
540
20b4c148 541solomon: Jared Johnson <jaredj@nmgi.com>
542
88f937fb 543spb: Stephen Bennett <stephen@freenode.net>
544
59187a3b 545Squeeks <squeek@cpan.org>
546
637ca936 547sszabo: Stephan Szabo <sszabo@bigpanda.com>
548
a9e8284f 549talexb: Alex Beamish <talexb@gmail.com>
550
7bf0d0d6 551tamias: Ronald J Kimball <rjk@tamias.net>
f92a9d79 552
386c2272 553teejay : Aaron Trevena <teejay@cpan.org>
554
84e3c114 555Todd Lipcon
e063fe2c 556
6eb6264e 557Tom Hukins
558
2e4b6d78 559tonvoon: Ton Voon <tonvoon@cpan.org>
560
d15e3fc5 561triode: Pete Gamache <gamache@cpan.org>
562
d3b0e369 563typester: Daisuke Murase <typester@cpan.org>
c0e7b4e5 564
4740bdb7 565victori: Victor Igumnov <victori@cpan.org>
566
d3b0e369 567wdh: Will Hawes
4c248161 568
124162a0 569wesm: Wes Malone <wes@mitsi.com>
570
00c03ced 571willert: Sebastian Willert <willert@cpan.org>
572
66d2a14e 573wreis: Wallace Reis <wreis@cpan.org>
574
d7c37d66 575xenoterracide: Caleb Cushing <xenoterracide@gmail.com>
576
d52d4d6e 577yrlnry: Mark Jason Dominus <mjd@plover.com>
578
d3b0e369 579zamolxes: Bogdan Lucaciu <bogdan@wiz.ro>
78060df8 580
b38e10bd 581=head1 COPYRIGHT
582
16be93fe 583Copyright (c) 2005 - 2011 the DBIx::Class L</AUTHOR> and L</CONTRIBUTORS>
b38e10bd 584as listed above.
585
96154ef7 586=head1 LICENSE
587
588This library is free software and may be distributed under the same terms
589as perl itself.