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