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