Reign in (a little bit) the sprawling CRLF insanity on Win32
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Optional / Dependencies.pm
CommitLineData
8057ed01 1package DBIx::Class::Optional::Dependencies;
2
3use warnings;
4use strict;
5
9c1700e3 6use Carp ();
fb39747c 7
8# NO EXTERNAL NON-5.8.1 CORE DEPENDENCIES EVER (e.g. C::A::G)
8057ed01 9# This module is to be loaded by Makefile.PM on a pristine system
10
f6b26571 11# POD is generated automatically by calling _gen_pod from the
12# Makefile.PL in $AUTHOR mode
13
2a2a7b23 14my $json_any = {
15 'JSON::Any' => '1.22',
16};
17
2b48ebff 18my $moose_basic = {
68de9438 19 'Moose' => '0.98',
20 'MooseX::Types' => '0.21',
21};
22
23my $replicated = {
24 %$moose_basic,
2b48ebff 25};
26
ebcd0e4f 27my $admin_basic = {
28 %$moose_basic,
2a2a7b23 29 %$json_any,
68de9438 30 'MooseX::Types::Path::Class' => '0.05',
31 'MooseX::Types::JSON' => '0.02',
68de9438 32 'namespace::autoclean' => '0.09',
33};
34
a0361822 35my $admin_script = {
36 %$moose_basic,
37 %$admin_basic,
38 'Getopt::Long::Descriptive' => '0.081',
39 'Text::CSV' => '1.16',
40};
41
68de9438 42my $datetime_basic = {
43 'DateTime' => '0.55',
44 'DateTime::Format::Strptime' => '1.2',
ebcd0e4f 45};
46
c7d50a7d 47my $id_shortener = {
26022fb5 48 'Math::BigInt' => '1.80',
c7d50a7d 49 'Math::Base36' => '0.07',
50};
51
be68095d 52my $rdbms_sqlite = {
53 'DBD::SQLite' => '0',
54};
55my $rdbms_pg = {
56 'DBD::Pg' => '0',
57};
58my $rdbms_mssql_odbc = {
59 'DBD::ODBC' => '0',
60};
61my $rdbms_mssql_sybase = {
62 'DBD::Sybase' => '0',
63};
56dca25f 64my $rdbms_mssql_ado = {
65 'DBD::ADO' => '0',
66};
726c8f65 67my $rdbms_msaccess_odbc = {
68 'DBD::ODBC' => '0',
69};
70my $rdbms_msaccess_ado = {
71 'DBD::ADO' => '0',
72};
be68095d 73my $rdbms_mysql = {
74 'DBD::mysql' => '0',
75};
76my $rdbms_oracle = {
77 'DBD::Oracle' => '0',
78 %$id_shortener,
79};
80my $rdbms_ase = {
81 'DBD::Sybase' => '0',
82};
83my $rdbms_db2 = {
84 'DBD::DB2' => '0',
85};
199fbc45 86my $rdbms_db2_400 = {
87 'DBD::ODBC' => '0',
88};
89my $rdbms_informix = {
90 'DBD::Informix' => '0',
91};
92my $rdbms_sqlanywhere = {
93 'DBD::SQLAnywhere' => '0',
94};
95my $rdbms_sqlanywhere_odbc = {
96 'DBD::ODBC' => '0',
97};
98my $rdbms_firebird = {
99 'DBD::Firebird' => '0',
100};
101my $rdbms_firebird_interbase = {
102 'DBD::InterBase' => '0',
103};
e02b39b4 104my $rdbms_firebird_odbc = {
105 'DBD::ODBC' => '0',
106};
be68095d 107
8057ed01 108my $reqs = {
bc4b0c04 109 dist_podinherit => {
110 req => {
111 'Pod::Inherit' => '0.90',
3d4c5a84 112 'Pod::Tree' => '0',
bc4b0c04 113 }
8057ed01 114 },
115
116 replicated => {
68de9438 117 req => $replicated,
f6b26571 118 pod => {
119 title => 'Storage::Replicated',
120 desc => 'Modules required for L<DBIx::Class::Storage::DBI::Replicated>',
121 },
8057ed01 122 },
123
68de9438 124 test_replicated => {
125 req => {
126 %$replicated,
127 'Test::Moose' => '0',
128 },
129 },
130
131
8057ed01 132 admin => {
2b48ebff 133 req => {
ebcd0e4f 134 %$admin_basic,
135 },
136 pod => {
137 title => 'DBIx::Class::Admin',
138 desc => 'Modules required for the DBIx::Class administrative library',
139 },
140 },
141
a4a02f15 142 admin_script => {
ebcd0e4f 143 req => {
a0361822 144 %$admin_script,
2b48ebff 145 },
e144415f 146 pod => {
147 title => 'dbicadmin',
148 desc => 'Modules required for the CLI DBIx::Class interface dbicadmin',
149 },
8057ed01 150 },
151
152 deploy => {
f6b26571 153 req => {
7536c92b 154 'SQL::Translator' => '0.11016',
f6b26571 155 },
156 pod => {
157 title => 'Storage::DBI::deploy()',
c7d50a7d 158 desc => 'Modules required for L<DBIx::Class::Storage::DBI/deploy> and L<DBIx::Class::Storage::DBI/deployment_statements>',
f6b26571 159 },
8057ed01 160 },
161
c7d50a7d 162 id_shortener => {
163 req => $id_shortener,
164 },
165
0d374214 166 test_component_accessor => {
167 req => {
168 'Class::Unload' => '0.07',
169 },
170 },
171
a109c954 172 test_pod => {
f6b26571 173 req => {
14d17d71 174 'Test::Pod' => '1.41',
a109c954 175 },
176 },
177
178 test_podcoverage => {
179 req => {
f6b26571 180 'Test::Pod::Coverage' => '1.08',
181 'Pod::Coverage' => '0.20',
a109c954 182 },
183 },
184
ffce4b65 185 test_whitespace => {
a109c954 186 req => {
8273e845 187 'Test::EOL' => '1.0',
ffce4b65 188 'Test::NoTabs' => '0.9',
f6b26571 189 },
8057ed01 190 },
191
2a2a7b23 192 test_prettydebug => {
193 req => $json_any,
194 },
195
99503754 196 test_admin_script => {
197 req => {
198 %$admin_script,
199 'JSON' => 0,
200 'JSON::XS' => 0,
201 $^O eq 'MSWin32'
202 # for t/admin/10script.t
203 ? ('Win32::ShellQuote' => 0)
204 # DWIW does not compile (./configure even) on win32
205 : ('JSON::DWIW' => 0 )
206 ,
207 }
208 },
209
226d1c35 210 test_leaks => {
f6b26571 211 req => {
f6b26571 212 'Test::Memory::Cycle' => '0',
213 'Devel::Cycle' => '1.10',
a109c954 214 },
215 },
f6b26571 216
68de9438 217 test_dt => {
218 req => $datetime_basic,
219 },
220
221 test_dt_sqlite => {
a109c954 222 req => {
68de9438 223 %$datetime_basic,
f6b26571 224 # t/36datetime.t
225 # t/60core.t
226 'DateTime::Format::SQLite' => '0',
68de9438 227 },
228 },
f6b26571 229
68de9438 230 test_dt_mysql => {
231 req => {
232 %$datetime_basic,
9c92bb1c 233 # t/inflate/datetime_mysql.t
234 # (doesn't need Mysql itself)
68de9438 235 'DateTime::Format::MySQL' => '0',
236 },
237 },
9c92bb1c 238
68de9438 239 test_dt_pg => {
240 req => {
241 %$datetime_basic,
9c92bb1c 242 # t/inflate/datetime_pg.t
243 # (doesn't need PG itself)
ab35aeab 244 'DateTime::Format::Pg' => '0.16004',
f6b26571 245 },
8057ed01 246 },
247
68de9438 248 test_cdbicompat => {
f6b26571 249 req => {
d9bd5195 250 'Class::DBI' => 0,
f6b26571 251 'Class::DBI::Plugin::DeepAbstractSearch' => '0',
d9bd5195 252 %$datetime_basic,
f6b26571 253 'Time::Piece::MySQL' => '0',
f6b26571 254 'Date::Simple' => '3.03',
255 },
8057ed01 256 },
257
be68095d 258 # this is just for completeness as SQLite
259 # is a core dep of DBIC for testing
260 rdbms_sqlite => {
261 req => {
262 %$rdbms_sqlite,
263 },
264 pod => {
265 title => 'SQLite support',
266 desc => 'Modules required to connect to SQLite',
267 },
268 },
269
270 rdbms_pg => {
271 req => {
a4fc1239 272 # when changing this list make sure to adjust xt/optional_deps.t
be68095d 273 %$rdbms_pg,
274 },
275 pod => {
276 title => 'PostgreSQL support',
277 desc => 'Modules required to connect to PostgreSQL',
278 },
279 },
280
281 rdbms_mssql_odbc => {
282 req => {
283 %$rdbms_mssql_odbc,
284 },
285 pod => {
286 title => 'MSSQL support via DBD::ODBC',
287 desc => 'Modules required to connect to MSSQL via DBD::ODBC',
288 },
289 },
290
291 rdbms_mssql_sybase => {
292 req => {
293 %$rdbms_mssql_sybase,
294 },
295 pod => {
296 title => 'MSSQL support via DBD::Sybase',
56dca25f 297 desc => 'Modules required to connect to MSSQL via DBD::Sybase',
298 },
299 },
300
301 rdbms_mssql_ado => {
302 req => {
303 %$rdbms_mssql_ado,
304 },
305 pod => {
306 title => 'MSSQL support via DBD::ADO (Windows only)',
307 desc => 'Modules required to connect to MSSQL via DBD::ADO. This particular DBD is available on Windows only',
be68095d 308 },
309 },
310
726c8f65 311 rdbms_msaccess_odbc => {
312 req => {
313 %$rdbms_msaccess_odbc,
314 },
315 pod => {
316 title => 'MS Access support via DBD::ODBC',
317 desc => 'Modules required to connect to MS Access via DBD::ODBC',
318 },
319 },
320
321 rdbms_msaccess_ado => {
322 req => {
323 %$rdbms_msaccess_ado,
324 },
325 pod => {
326 title => 'MS Access support via DBD::ADO (Windows only)',
327 desc => 'Modules required to connect to MS Access via DBD::ADO. This particular DBD is available on Windows only',
328 },
329 },
330
be68095d 331 rdbms_mysql => {
332 req => {
333 %$rdbms_mysql,
334 },
335 pod => {
336 title => 'MySQL support',
337 desc => 'Modules required to connect to MySQL',
338 },
339 },
340
341 rdbms_oracle => {
342 req => {
343 %$rdbms_oracle,
344 },
345 pod => {
346 title => 'Oracle support',
347 desc => 'Modules required to connect to Oracle',
348 },
349 },
350
351 rdbms_ase => {
352 req => {
353 %$rdbms_ase,
354 },
355 pod => {
356 title => 'Sybase ASE support',
357 desc => 'Modules required to connect to Sybase ASE',
358 },
359 },
360
361 rdbms_db2 => {
362 req => {
363 %$rdbms_db2,
364 },
365 pod => {
366 title => 'DB2 support',
367 desc => 'Modules required to connect to DB2',
368 },
369 },
370
199fbc45 371 rdbms_db2_400 => {
372 req => {
373 %$rdbms_db2_400,
374 },
375 pod => {
376 title => 'DB2 on AS/400 support',
377 desc => 'Modules required to connect to DB2 on AS/400',
378 },
379 },
380
381 rdbms_informix => {
382 req => {
383 %$rdbms_informix,
384 },
385 pod => {
386 title => 'Informix support',
387 desc => 'Modules required to connect to Informix',
388 },
8273e845 389 },
199fbc45 390
391 rdbms_sqlanywhere => {
392 req => {
393 %$rdbms_sqlanywhere,
394 },
395 pod => {
396 title => 'SQLAnywhere support',
397 desc => 'Modules required to connect to SQLAnywhere',
398 },
8273e845 399 },
199fbc45 400
401 rdbms_sqlanywhere_odbc => {
402 req => {
403 %$rdbms_sqlanywhere_odbc,
404 },
405 pod => {
406 title => 'SQLAnywhere support via DBD::ODBC',
407 desc => 'Modules required to connect to SQLAnywhere via DBD::ODBC',
408 },
8273e845 409 },
199fbc45 410
411 rdbms_firebird => {
412 req => {
413 %$rdbms_firebird,
414 },
415 pod => {
416 title => 'Firebird support',
417 desc => 'Modules required to connect to Firebird',
418 },
8273e845 419 },
199fbc45 420
421 rdbms_firebird_interbase => {
422 req => {
423 %$rdbms_firebird_interbase,
424 },
425 pod => {
426 title => 'Firebird support via DBD::InterBase',
427 desc => 'Modules required to connect to Firebird via DBD::InterBase',
428 },
8273e845 429 },
199fbc45 430
431 rdbms_firebird_odbc => {
432 req => {
433 %$rdbms_firebird_odbc,
434 },
435 pod => {
436 title => 'Firebird support via DBD::ODBC',
437 desc => 'Modules required to connect to Firebird via DBD::ODBC',
438 },
8273e845 439 },
199fbc45 440
be68095d 441# the order does matter because the rdbms support group might require
442# a different version that the test group
68de9438 443 test_rdbms_pg => {
f6b26571 444 req => {
445 $ENV{DBICTEST_PG_DSN}
446 ? (
a4fc1239 447 # when changing this list make sure to adjust xt/optional_deps.t
be68095d 448 %$rdbms_pg,
b9d84a2d 449 ($^O ne 'MSWin32' ? ('Sys::SigAction' => '0') : ()),
f6b26571 450 'DBD::Pg' => '2.009002',
f6b26571 451 ) : ()
452 },
8057ed01 453 },
454
afae8507 455 test_rdbms_mssql_odbc => {
456 req => {
457 $ENV{DBICTEST_MSSQL_ODBC_DSN}
458 ? (
be68095d 459 %$rdbms_mssql_odbc,
afae8507 460 ) : ()
461 },
462 },
463
56dca25f 464 test_rdbms_mssql_ado => {
465 req => {
466 $ENV{DBICTEST_MSSQL_ADO_DSN}
467 ? (
468 %$rdbms_mssql_ado,
469 ) : ()
470 },
471 },
472
afae8507 473 test_rdbms_mssql_sybase => {
474 req => {
475 $ENV{DBICTEST_MSSQL_DSN}
476 ? (
be68095d 477 %$rdbms_mssql_sybase,
afae8507 478 ) : ()
479 },
480 },
481
726c8f65 482 test_rdbms_msaccess_odbc => {
483 req => {
484 $ENV{DBICTEST_MSACCESS_ODBC_DSN}
485 ? (
486 %$rdbms_msaccess_odbc,
487 %$datetime_basic,
488 'Data::GUID' => '0',
489 ) : ()
490 },
491 },
492
493 test_rdbms_msaccess_ado => {
494 req => {
495 $ENV{DBICTEST_MSACCESS_ADO_DSN}
496 ? (
497 %$rdbms_msaccess_ado,
498 %$datetime_basic,
499 'Data::GUID' => 0,
500 ) : ()
501 },
502 },
503
68de9438 504 test_rdbms_mysql => {
f6b26571 505 req => {
506 $ENV{DBICTEST_MYSQL_DSN}
507 ? (
be68095d 508 %$rdbms_mysql,
f6b26571 509 ) : ()
510 },
8057ed01 511 },
512
68de9438 513 test_rdbms_oracle => {
f6b26571 514 req => {
515 $ENV{DBICTEST_ORA_DSN}
516 ? (
be68095d 517 %$rdbms_oracle,
f6b26571 518 'DateTime::Format::Oracle' => '0',
e1b7e9b4 519 'DBD::Oracle' => '1.24',
f6b26571 520 ) : ()
521 },
8057ed01 522 },
523
68de9438 524 test_rdbms_ase => {
f6b26571 525 req => {
526 $ENV{DBICTEST_SYBASE_DSN}
527 ? (
be68095d 528 %$rdbms_ase,
f6b26571 529 ) : ()
530 },
8057ed01 531 },
532
68de9438 533 test_rdbms_db2 => {
f58a165c 534 req => {
535 $ENV{DBICTEST_DB2_DSN}
536 ? (
be68095d 537 %$rdbms_db2,
f58a165c 538 ) : ()
539 },
540 },
541
199fbc45 542 test_rdbms_db2_400 => {
543 req => {
544 $ENV{DBICTEST_DB2_400_DSN}
545 ? (
546 %$rdbms_db2_400,
547 ) : ()
548 },
549 },
550
551 test_rdbms_informix => {
552 req => {
553 $ENV{DBICTEST_INFORMIX_DSN}
554 ? (
555 %$rdbms_informix,
556 ) : ()
557 },
558 },
559
560 test_rdbms_sqlanywhere => {
561 req => {
562 $ENV{DBICTEST_SQLANYWHERE_DSN}
563 ? (
564 %$rdbms_sqlanywhere,
565 ) : ()
566 },
567 },
568
569 test_rdbms_sqlanywhere_odbc => {
570 req => {
571 $ENV{DBICTEST_SQLANYWHERE_ODBC_DSN}
572 ? (
573 %$rdbms_sqlanywhere_odbc,
574 ) : ()
575 },
576 },
577
578 test_rdbms_firebird => {
579 req => {
580 $ENV{DBICTEST_FIREBIRD_DSN}
581 ? (
582 %$rdbms_firebird,
583 ) : ()
584 },
585 },
586
587 test_rdbms_firebird_interbase => {
588 req => {
589 $ENV{DBICTEST_FIREBIRD_INTERBASE_DSN}
590 ? (
591 %$rdbms_firebird_interbase,
592 ) : ()
593 },
594 },
595
e02b39b4 596 test_rdbms_firebird_odbc => {
597 req => {
598 $ENV{DBICTEST_FIREBIRD_ODBC_DSN}
599 ? (
600 %$rdbms_firebird_odbc,
601 ) : ()
602 },
603 },
604
42168332 605 test_memcached => {
606 req => {
607 $ENV{DBICTEST_MEMCACHED}
608 ? (
609 'Cache::Memcached' => 0,
610 ) : ()
611 },
612 },
613
8057ed01 614};
615
f6b26571 616
fb39747c 617sub req_list_for {
618 my ($class, $group) = @_;
619
9c1700e3 620 Carp::croak "req_list_for() expects a requirement group name"
fb39747c 621 unless $group;
622
f6b26571 623 my $deps = $reqs->{$group}{req}
9c1700e3 624 or Carp::croak "Requirement group '$group' does not exist";
fb39747c 625
626 return { %$deps };
627}
628
629
630our %req_availability_cache;
631sub req_ok_for {
632 my ($class, $group) = @_;
633
9c1700e3 634 Carp::croak "req_ok_for() expects a requirement group name"
fb39747c 635 unless $group;
636
d8799bab 637 return $class->_check_deps($group)->{status};
fb39747c 638}
639
640sub req_missing_for {
641 my ($class, $group) = @_;
642
9c1700e3 643 Carp::croak "req_missing_for() expects a requirement group name"
fb39747c 644 unless $group;
645
d8799bab 646 return $class->_check_deps($group)->{missing};
fb39747c 647}
648
649sub req_errorlist_for {
650 my ($class, $group) = @_;
651
9c1700e3 652 Carp::croak "req_errorlist_for() expects a requirement group name"
fb39747c 653 unless $group;
654
d8799bab 655 return $class->_check_deps($group)->{errorlist};
fb39747c 656}
657
658sub _check_deps {
659 my ($class, $group) = @_;
660
d8799bab 661 return $req_availability_cache{$group} ||= do {
662
663 my $deps = $class->req_list_for ($group);
664
665 my %errors;
666 for my $mod (keys %$deps) {
667 my $req_line = "require $mod;";
668 if (my $ver = $deps->{$mod}) {
669 $req_line .= "$mod->VERSION($ver);";
670 }
671
672 eval $req_line;
673
674 $errors{$mod} = $@ if $@;
675 }
676
677 my $res;
fb39747c 678
d8799bab 679 if (keys %errors) {
680 my $missing = join (', ', map { $deps->{$_} ? "$_ >= $deps->{$_}" : $_ } (sort keys %errors) );
681 $missing .= " (see $class for details)" if $reqs->{$group}{pod};
682 $res = {
683 status => 0,
684 errorlist => \%errors,
685 missing => $missing,
686 };
fb39747c 687 }
688 else {
d8799bab 689 $res = {
690 status => 1,
691 errorlist => {},
692 missing => '',
693 };
fb39747c 694 }
695
d8799bab 696 $res;
697 };
fb39747c 698}
699
e3fc11e1 700sub req_group_list {
701 return { map { $_ => { %{ $reqs->{$_}{req} || {} } } } (keys %$reqs) };
702}
703
704# This is to be called by the author only (automatically in Makefile.PL)
f6b26571 705sub _gen_pod {
47589465 706 my ($class, $distver, $pod_dir) = @_;
31fa1764 707
47589465 708 die "No POD root dir supplied" unless $pod_dir;
31fa1764 709
ccebe1f1 710 $distver ||=
31fa1764 711 eval { require DBIx::Class; DBIx::Class->VERSION; }
712 ||
ccebe1f1 713 die
31fa1764 714"\n\n---------------------------------------------------------------------\n" .
715'Unable to load core DBIx::Class module to determine current version, '.
716'possibly due to missing dependencies. Author-mode autodocumentation ' .
717"halted\n\n" . $@ .
718"\n\n---------------------------------------------------------------------\n"
31fa1764 719 ;
720
3d4c5a84 721 # do not ask for a recent version, use 1.x API calls
47589465 722 # this *may* execute on a smoker with old perl or whatnot
723 require File::Path;
724
725 (my $modfn = __PACKAGE__ . '.pm') =~ s|::|/|g;
726
727 (my $podfn = "$pod_dir/$modfn") =~ s/\.pm$/\.pod/;
728 (my $dir = $podfn) =~ s|/[^/]+$||;
729
730 File::Path::mkpath([$dir]);
731
e3fc11e1 732 my $sqltver = $class->req_list_for ('deploy')->{'SQL::Translator'}
733 or die "Hrmm? No sqlt dep?";
7e3dc46f 734
f6b26571 735 my @chunks = (
6343a203 736 <<"EOC",
af4ac504 737#########################################################################
738##################### A U T O G E N E R A T E D ########################
739#########################################################################
740#
741# The contents of this POD file are auto-generated. Any changes you make
742# will be lost. If you need to change the generated text edit _gen_pod()
743# at the end of $modfn
744#
745EOC
f6b26571 746 '=head1 NAME',
7e3dc46f 747 "$class - Optional module dependency specifications (for module authors)",
e3fc11e1 748 '=head1 SYNOPSIS',
d8799bab 749 <<"EOS",
7e3dc46f 750Somewhere in your build-file (e.g. L<Module::Install>'s Makefile.PL):
751
752 ...
753
754 configure_requires 'DBIx::Class' => '$distver';
755
756 require $class;
757
be68095d 758 my \$deploy_deps = $class->req_list_for('deploy');
7e3dc46f 759
760 for (keys %\$deploy_deps) {
761 requires \$_ => \$deploy_deps->{\$_};
762 }
763
764 ...
765
766Note that there are some caveats regarding C<configure_requires()>, more info
767can be found at L<Module::Install/configure_requires>
768EOS
f6b26571 769 '=head1 DESCRIPTION',
770 <<'EOD',
771Some of the less-frequently used features of L<DBIx::Class> have external
772module dependencies on their own. In order not to burden the average user
773with modules he will never use, these optional dependencies are not included
774in the base Makefile.PL. Instead an exception with a descriptive message is
775thrown when a specific feature is missing one or several modules required for
776its operation. This module is the central holding place for the current list
7e3dc46f 777of such dependencies, for DBIx::Class core authors, and DBIx::Class extension
778authors alike.
f6b26571 779EOD
780 '=head1 CURRENT REQUIREMENT GROUPS',
781 <<'EOD',
782Dependencies are organized in C<groups> and each group can list one or more
783required modules, with an optional minimum version (or 0 for any version).
ecb68746 784The group name can be used in the
f6b26571 785EOD
786 );
787
788 for my $group (sort keys %$reqs) {
789 my $p = $reqs->{$group}{pod}
790 or next;
791
792 my $modlist = $reqs->{$group}{req}
793 or next;
794
795 next unless keys %$modlist;
796
797 push @chunks, (
798 "=head2 $p->{title}",
799 "$p->{desc}",
800 '=over',
801 ( map { "=item * $_" . ($modlist->{$_} ? " >= $modlist->{$_}" : '') } (sort keys %$modlist) ),
802 '=back',
803 "Requirement group: B<$group>",
804 );
805 }
806
807 push @chunks, (
808 '=head1 METHODS',
e3fc11e1 809 '=head2 req_group_list',
810 '=over',
d8799bab 811 '=item Arguments: none',
fb13a49f 812 '=item Return Value: \%list_of_requirement_groups',
e3fc11e1 813 '=back',
d8799bab 814 <<'EOD',
e3fc11e1 815This method should be used by DBIx::Class packagers, to get a hashref of all
816dependencies keyed by dependency group. Each key (group name) can be supplied
817to one of the group-specific methods below.
818EOD
819
f6b26571 820 '=head2 req_list_for',
821 '=over',
822 '=item Arguments: $group_name',
fb13a49f 823 '=item Return Value: \%list_of_module_version_pairs',
f6b26571 824 '=back',
d8799bab 825 <<'EOD',
f6b26571 826This method should be used by DBIx::Class extension authors, to determine the
7e3dc46f 827version of modules a specific feature requires in the B<current> version of
e3fc11e1 828DBIx::Class. See the L</SYNOPSIS> for a real-world
7e3dc46f 829example.
f6b26571 830EOD
831
832 '=head2 req_ok_for',
833 '=over',
834 '=item Arguments: $group_name',
fb13a49f 835 '=item Return Value: 1|0',
f6b26571 836 '=back',
d8799bab 837 <<'EOD',
838Returns true or false depending on whether all modules required by
839C<$group_name> are present on the system and loadable.
840EOD
f6b26571 841
842 '=head2 req_missing_for',
843 '=over',
844 '=item Arguments: $group_name',
fb13a49f 845 '=item Return Value: $error_message_string',
f6b26571 846 '=back',
d8799bab 847 <<"EOD",
f6b26571 848Returns a single line string suitable for inclusion in larger error messages.
849This method would normally be used by DBIx::Class core-module author, to
850indicate to the user that he needs to install specific modules before he will
851be able to use a specific feature.
852
e3fc11e1 853For example if some of the requirements for C<deploy> are not available,
854the returned string could look like:
f6b26571 855
e3fc11e1 856 SQL::Translator >= $sqltver (see $class for details)
f6b26571 857
858The author is expected to prepend the necessary text to this message before
859returning the actual error seen by the user.
860EOD
861
862 '=head2 req_errorlist_for',
863 '=over',
864 '=item Arguments: $group_name',
fb13a49f 865 '=item Return Value: \%list_of_loaderrors_per_module',
f6b26571 866 '=back',
867 <<'EOD',
868Returns a hashref containing the actual errors that occured while attempting
869to load each module in the requirement group.
870EOD
fb8ae353 871 '=head1 AUTHOR',
872 'See L<DBIx::Class/CONTRIBUTORS>.',
873 '=head1 LICENSE',
874 'You may distribute this code under the same terms as Perl itself',
f6b26571 875 );
876
9c1700e3 877 open (my $fh, '>', $podfn) or Carp::croak "Unable to write to $podfn: $!";
f6b26571 878 print $fh join ("\n\n", @chunks);
47589465 879 print $fh "\n";
f6b26571 880 close ($fh);
881}
882
8057ed01 8831;