switch from Class::MOP::class_of to Moose::Util::find_meta
[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
bfcecabc 401ether: Karen Etheridge <ether@cpan.org>
402
307f1265 403felliott: Fitz Elliott <fitz.elliott@gmail.com>
404
0ffada27 405freetime: Bill Moseley <moseley@hank.org>
406
ade0fe3b 407frew: Arthur Axel "fREW" Schmidt <frioux@gmail.com>
408
b4987ed0 409goraxe: Gordon Irving <goraxe@cpan.org>
410
d3b0e369 411gphat: Cory G Watson <gphat@cpan.org>
ad3d2d7c 412
61f031bf 413Grant Street Group L<http://www.grantstreet.com/>
414
e758ffe6 415groditi: Guillermo Roditi <groditi@cpan.org>
416
6dad89f5 417Haarg: Graham Knop <haarg@haarg.org>
418
157ce0cf 419hobbs: Andrew Rodland <arodland@cpan.org>
420
5d779578 421ilmari: Dagfinn Ilmari MannsE<aring>ker <ilmari@ilmari.org>
422
0ac0af6c 423initself: Mike Baas <mike@initselftech.com>
424
2bb4c37b 425ironcamel: Naveed Massjouni <naveedm9@gmail.com>
426
f165eda8 427jawnsy: Jonathan Yu <jawnsy@cpan.org>
428
bee21976 429jasonmay: Jason May <jason.a.may@gmail.com>
430
d3b0e369 431jesper: Jesper Krogh
5fb0c64c 432
4a743a00 433jgoulah: John Goulah <jgoulah@cpan.org>
434
102a2984 435jguenther: Justin Guenther <jguenther@cpan.org>
d7c4c15c 436
a14a46e2 437jhannah: Jay Hannah <jay@jays.net>
438
dffda3a2 439jmac: Jason McIntosh <jmac@appleseed-sc.com>
440
8b93a938 441jnapiorkowski: John Napiorkowski <jjn1056@yahoo.com>
442
11736b4c 443jon: Jon Schutz <jjschutz@cpan.org>
444
1aec4bac 445jshirley: J. Shirley <jshirley@gmail.com>
446
41519379 447kaare: Kaare Rasmussen
448
d3b0e369 449konobi: Scott McWhirter
535fc2ee 450
4e0a89e4 451littlesavage: Alexey Illarionov <littlesavage@orionet.ru>
452
4367679a 453lukes: Luke Saunders <luke.saunders@gmail.com>
454
709ea492 455marcus: Marcus Ramberg <mramberg@cpan.org>
456
114780ee 457mattlaw: Matt Lawrence
458
45bffdf0 459mattp: Matt Phillips <mattp@cpan.org>
460
58755bba 461michaelr: Michael Reddick <michael.reddick@gmail.com>
462
91d0c99f 463milki: Jonathan Chu <milki@rescomp.berkeley.edu>
464
b81d8515 465mithaldu: Christian Walde <walde.christian@gmail.com>
466
582fe49d 467mjemmeson: Michael Jemmeson <michael.jemmeson@gmail.com>
468
167e7634 469mstratman: Mark A. Stratman <stratman@gmail.com>
470
77e7e47d 471ned: Neil de Carteret
472
266bdcc3 473nigel: Nigel Metheringham <nigelm@cpan.org>
6565b410 474
d3b0e369 475ningu: David Kamholz <dkamholz@cpan.org>
476
66cf3a84 477Nniuq: Ron "Quinn" Straight" <quinnfazigu@gmail.org>
478
20b4c148 479norbi: Norbert Buchmuller <norbi@nix.hu>
480
48580715 481nuba: Nuba Princigalli <nuba@cpan.org>
482
d3b0e369 483Numa: Dan Sully <daniel@cpan.org>
484
dc571b76 485ovid: Curtis "Ovid" Poe <ovid@cpan.org>
486
6c30f9c3 487oyse: E<Oslash>ystein Torget <oystein.torget@dnv.com>
bf356c54 488
266bdcc3 489paulm: Paul Makepeace
4763f4b7 490
d3b0e369 491penguin: K J Cheetham
492
8cfef6f5 493perigrin: Chris Prather <chris@prather.org>
494
14899528 495peter: Peter Collingbourne <peter@pcc.me.uk>
caac1708 496
f8213ab0 497Peter Siklósi <einon@einon.hu>
498
6c30f9c3 499Peter Valdemar ME<oslash>rch <peter@morch.com>
500
266bdcc3 501phaylon: Robert Sedlacek <phaylon@dunkelheit.at>
a53b95f1 502
56fadd8f 503plu: Johannes Plunien <plu@cpan.org>
504
0c1a4a15 505Possum: Daniel LeWarne <possum@cpan.org>
506
d3b0e369 507quicksilver: Jules Bean
022e0893 508
4ed01b34 509rafl: Florian Ragwitz <rafl@debian.org>
510
0c1a4a15 511rainboxx: Matthias Dietrich <perl@rb.ly>
512
868a7b26 513rbo: Robert Bohne <rbo@cpan.org>
514
7ff0dace 515rbuels: Robert Buels <rmb32@cornell.edu>
516
0da8b7da 517rdj: Ryan D Johnson <ryan@innerfence.com>
518
66b1e361 519ribasushi: Peter Rabbitson <ribasushi@cpan.org>
d76e282a 520
b487918c 521rjbs: Ricardo Signes <rjbs@cpan.org>
522
6ffb5be5 523robkinyon: Rob Kinyon <rkinyon@cpan.org>
524
726c8f65 525Robert Olson <bob@rdolson.org>
526
a93441f2 527moltar: Roman Filippov <romanf@cpan.org>
e4c9f3f0 528
dc81dba3 529Sadrak: Felix Antonius Wilhelm Ostmann <sadrak@cpan.org>
530
d3b0e369 531sc_: Just Another Perl Hacker
ba606e58 532
266bdcc3 533scotty: Scotty Allen <scotty@scottyallen.com>
181a28f4 534
1c133e22 535semifor: Marc Mims <marc@questright.com>
536
16667b3a 537SineSwiper: Brendan Byrd <bbyrd@cpan.org>
538
20b4c148 539solomon: Jared Johnson <jaredj@nmgi.com>
540
88f937fb 541spb: Stephen Bennett <stephen@freenode.net>
542
59187a3b 543Squeeks <squeek@cpan.org>
544
637ca936 545sszabo: Stephan Szabo <sszabo@bigpanda.com>
546
a9e8284f 547talexb: Alex Beamish <talexb@gmail.com>
548
7bf0d0d6 549tamias: Ronald J Kimball <rjk@tamias.net>
f92a9d79 550
386c2272 551teejay : Aaron Trevena <teejay@cpan.org>
552
84e3c114 553Todd Lipcon
e063fe2c 554
6eb6264e 555Tom Hukins
556
2e4b6d78 557tonvoon: Ton Voon <tonvoon@cpan.org>
558
d15e3fc5 559triode: Pete Gamache <gamache@cpan.org>
560
d3b0e369 561typester: Daisuke Murase <typester@cpan.org>
c0e7b4e5 562
4740bdb7 563victori: Victor Igumnov <victori@cpan.org>
564
d3b0e369 565wdh: Will Hawes
4c248161 566
124162a0 567wesm: Wes Malone <wes@mitsi.com>
568
00c03ced 569willert: Sebastian Willert <willert@cpan.org>
570
66d2a14e 571wreis: Wallace Reis <wreis@cpan.org>
572
d7c37d66 573xenoterracide: Caleb Cushing <xenoterracide@gmail.com>
574
d52d4d6e 575yrlnry: Mark Jason Dominus <mjd@plover.com>
576
d3b0e369 577zamolxes: Bogdan Lucaciu <bogdan@wiz.ro>
78060df8 578
b38e10bd 579=head1 COPYRIGHT
580
16be93fe 581Copyright (c) 2005 - 2011 the DBIx::Class L</AUTHOR> and L</CONTRIBUTORS>
b38e10bd 582as listed above.
583
96154ef7 584=head1 LICENSE
585
586This library is free software and may be distributed under the same terms
587as perl itself.