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