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