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