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