1 package DBIx::Class::Optional::Dependencies;
8 # NO EXTERNAL NON-5.8.1 CORE DEPENDENCIES EVER (e.g. C::A::G)
9 # This module is to be loaded by Makefile.PM on a pristine system
11 # POD is generated automatically by calling _gen_pod from the
12 # Makefile.PL in $AUTHOR mode
16 'MooseX::Types' => '0.21',
21 'MooseX::Types::Path::Class' => '0.05',
22 'MooseX::Types::JSON' => '0.02',
23 'JSON::Any' => '1.22',
24 'namespace::autoclean' => '0.09',
29 #'Module::Install::Pod::Inherit' => '0.01',
35 'namespace::clean' => '0.11',
36 'Hash::Merge' => '0.12',
39 title => 'Storage::Replicated',
40 desc => 'Modules required for L<DBIx::Class::Storage::DBI::Replicated>',
49 title => 'DBIx::Class::Admin',
50 desc => 'Modules required for the DBIx::Class administrative library',
58 'Getopt::Long::Descriptive' => '0.081',
59 'Text::CSV' => '1.16',
63 desc => 'Modules required for the CLI DBIx::Class interface dbicadmin',
69 'SQL::Translator' => '0.11002',
72 title => 'Storage::DBI::deploy()',
73 desc => 'Modules required for L<DBIx::Class::Storage::DBI/deploy> and L<DBIx::Class::Storage::DBI/deploymen_statements>',
80 'Test::Pod' => '1.41',
86 'Test::Pod::Coverage' => '1.08',
87 'Pod::Coverage' => '0.20',
93 #'Test::NoTabs' => '0.9',
99 #'Test::EOL' => '0.6',
105 'Test::Memory::Cycle' => '0',
106 'Devel::Cycle' => '1.10',
114 'DateTime::Format::SQLite' => '0',
116 # t/96_is_deteministic_value.t
117 'DateTime::Format::Strptime'=> '0',
119 # t/inflate/datetime_mysql.t
120 # (doesn't need Mysql itself)
121 'DateTime::Format::MySQL' => '0',
123 # t/inflate/datetime_pg.t
124 # (doesn't need PG itself)
125 'DateTime::Format::Pg' => '0',
131 'DBIx::ContextualFetch' => '0',
132 'Class::DBI::Plugin::DeepAbstractSearch' => '0',
133 'Class::Trigger' => '0',
134 'Time::Piece::MySQL' => '0',
136 'Date::Simple' => '3.03',
142 $ENV{DBICTEST_PG_DSN}
144 'Sys::SigAction' => '0',
145 'DBD::Pg' => '2.009002',
152 $ENV{DBICTEST_MYSQL_DSN}
161 $ENV{DBICTEST_ORA_DSN}
163 'DateTime::Format::Oracle' => '0',
170 $ENV{DBICTEST_SYBASE_DSN}
172 'DateTime::Format::Sybase' => 0,
179 (scalar grep $_, @ENV{qw/DBICTEST_SYBASE_ASA_DSN DBICTEST_SYBASE_ASA_ODBC_DSN/})
181 'DateTime::Format::Strptime' => 0,
188 sub _all_optional_requirements {
189 return { map { %{ $reqs->{$_}{req} || {} } } (keys %$reqs) };
193 my ($class, $group) = @_;
195 croak "req_list_for() expects a requirement group name"
198 my $deps = $reqs->{$group}{req}
199 or croak "Requirement group '$group' does not exist";
205 our %req_availability_cache;
207 my ($class, $group) = @_;
209 croak "req_ok_for() expects a requirement group name"
212 $class->_check_deps ($group) unless $req_availability_cache{$group};
214 return $req_availability_cache{$group}{status};
217 sub req_missing_for {
218 my ($class, $group) = @_;
220 croak "req_missing_for() expects a requirement group name"
223 $class->_check_deps ($group) unless $req_availability_cache{$group};
225 return $req_availability_cache{$group}{missing};
228 sub req_errorlist_for {
229 my ($class, $group) = @_;
231 croak "req_errorlist_for() expects a requirement group name"
234 $class->_check_deps ($group) unless $req_availability_cache{$group};
236 return $req_availability_cache{$group}{errorlist};
240 my ($class, $group) = @_;
242 my $deps = $class->req_list_for ($group);
245 for my $mod (keys %$deps) {
246 if (my $ver = $deps->{$mod}) {
247 eval "use $mod $ver ()";
253 $errors{$mod} = $@ if $@;
257 my $missing = join (', ', map { $deps->{$_} ? "$_ >= $deps->{$_}" : $_ } (sort keys %errors) );
258 $missing .= " (see $class for details)" if $reqs->{$group}{pod};
259 $req_availability_cache{$group} = {
261 errorlist => { %errors },
266 $req_availability_cache{$group} = {
274 # This is to be called by the author onbly (automatically in Makefile.PL)
277 my $modfn = __PACKAGE__ . '.pm';
278 $modfn =~ s/\:\:/\//g;
281 my $distver = DBIx::Class->VERSION;
285 #########################################################################
286 ##################### A U T O G E N E R A T E D ########################
287 #########################################################################
289 # The contents of this POD file are auto-generated. Any changes you make
290 # will be lost. If you need to change the generated text edit _gen_pod()
291 # at the end of $modfn
295 "$class - Optional module dependency specifications (for module authors)",
296 '=head1 SYNOPSIS (EXPERIMENTAL)',
298 B<THE USAGE SHOWN HERE IS EXPERIMENTAL>
300 Somewhere in your build-file (e.g. L<Module::Install>'s Makefile.PL):
304 configure_requires 'DBIx::Class' => '$distver';
308 my \$deploy_deps = $class->req_list_for ('deploy');
310 for (keys %\$deploy_deps) {
311 requires \$_ => \$deploy_deps->{\$_};
316 Note that there are some caveats regarding C<configure_requires()>, more info
317 can be found at L<Module::Install/configure_requires>
319 '=head1 DESCRIPTION',
321 Some of the less-frequently used features of L<DBIx::Class> have external
322 module dependencies on their own. In order not to burden the average user
323 with modules he will never use, these optional dependencies are not included
324 in the base Makefile.PL. Instead an exception with a descriptive message is
325 thrown when a specific feature is missing one or several modules required for
326 its operation. This module is the central holding place for the current list
327 of such dependencies, for DBIx::Class core authors, and DBIx::Class extension
330 '=head1 CURRENT REQUIREMENT GROUPS',
332 Dependencies are organized in C<groups> and each group can list one or more
333 required modules, with an optional minimum version (or 0 for any version).
334 The group name can be used in the
338 for my $group (sort keys %$reqs) {
339 my $p = $reqs->{$group}{pod}
342 my $modlist = $reqs->{$group}{req}
345 next unless keys %$modlist;
348 "=head2 $p->{title}",
351 ( map { "=item * $_" . ($modlist->{$_} ? " >= $modlist->{$_}" : '') } (sort keys %$modlist) ),
353 "Requirement group: B<$group>",
359 '=head2 req_list_for',
361 '=item Arguments: $group_name',
362 '=item Returns: \%list_of_module_version_pairs',
365 This method should be used by DBIx::Class extension authors, to determine the
366 version of modules a specific feature requires in the B<current> version of
367 DBIx::Class. See the L<SYNOPSIS|/SYNOPSIS (EXPERIMENTAL)> for a real-world
373 '=item Arguments: $group_name',
374 '=item Returns: 1|0',
376 'Returns true or false depending on whether all modules required by C<$group_name> are present on the system and loadable',
378 '=head2 req_missing_for',
380 '=item Arguments: $group_name',
381 '=item Returns: $error_message_string',
384 Returns a single line string suitable for inclusion in larger error messages.
385 This method would normally be used by DBIx::Class core-module author, to
386 indicate to the user that he needs to install specific modules before he will
387 be able to use a specific feature.
389 For example if the requirements for C<replicated> are not available, the
390 returned string would look like:
392 Moose >= 0.98, MooseX::Types >= 0.21, namespace::clean (see $class for details)
394 The author is expected to prepend the necessary text to this message before
395 returning the actual error seen by the user.
398 '=head2 req_errorlist_for',
400 '=item Arguments: $group_name',
401 '=item Returns: \%list_of_loaderrors_per_module',
404 Returns a hashref containing the actual errors that occured while attempting
405 to load each module in the requirement group.
408 'See L<DBIx::Class/CONTRIBUTORS>.',
410 'You may distribute this code under the same terms as Perl itself',
414 $fn =~ s/\.pm$/\.pod/;
416 open (my $fh, '>', $fn) or croak "Unable to write to $fn: $!";
417 print $fh join ("\n\n", @chunks);