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