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