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