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.11',
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>',
79 'Test::Pod' => '1.26',
80 'Test::Pod::Coverage' => '1.08',
81 'Pod::Coverage' => '0.20',
82 #'Test::NoTabs' => '0.9',
83 #'Test::EOL' => '0.6',
90 'Test::Memory::Cycle' => '0',
91 'Devel::Cycle' => '1.10',
95 'DateTime::Format::SQLite' => '0',
97 # t/96_is_deteministic_value.t
98 'DateTime::Format::Strptime'=> '0',
104 'DBIx::ContextualFetch' => '0',
105 'Class::DBI::Plugin::DeepAbstractSearch' => '0',
106 'Class::Trigger' => '0',
107 'Time::Piece::MySQL' => '0',
109 'Date::Simple' => '3.03',
115 $ENV{DBICTEST_PG_DSN}
117 'Sys::SigAction' => '0',
118 'DBD::Pg' => '2.009002',
119 'DateTime::Format::Pg' => '0',
126 $ENV{DBICTEST_MYSQL_DSN}
128 'DateTime::Format::MySQL' => '0',
136 $ENV{DBICTEST_ORA_DSN}
138 'DateTime::Format::Oracle' => '0',
145 $ENV{DBICTEST_SYBASE_DSN}
147 'DateTime::Format::Sybase' => 0,
154 grep $_, @ENV{qw/DBICTEST_SYBASE_ASA_DSN DBICTEST_SYBASE_ASA_ODBC_DSN/}
156 'DateTime::Format::Strptime' => 0,
163 sub _all_optional_requirements {
164 return { map { %{ $reqs->{$_}{req} || {} } } (keys %$reqs) };
168 my ($class, $group) = @_;
170 croak "req_list_for() expects a requirement group name"
173 my $deps = $reqs->{$group}{req}
174 or croak "Requirement group '$group' does not exist";
180 our %req_availability_cache;
182 my ($class, $group) = @_;
184 croak "req_ok_for() expects a requirement group name"
187 $class->_check_deps ($group) unless $req_availability_cache{$group};
189 return $req_availability_cache{$group}{status};
192 sub req_missing_for {
193 my ($class, $group) = @_;
195 croak "req_missing_for() expects a requirement group name"
198 $class->_check_deps ($group) unless $req_availability_cache{$group};
200 return $req_availability_cache{$group}{missing};
203 sub req_errorlist_for {
204 my ($class, $group) = @_;
206 croak "req_errorlist_for() expects a requirement group name"
209 $class->_check_deps ($group) unless $req_availability_cache{$group};
211 return $req_availability_cache{$group}{errorlist};
215 my ($class, $group) = @_;
217 my $deps = $class->req_list_for ($group);
220 for my $mod (keys %$deps) {
221 if (my $ver = $deps->{$mod}) {
222 eval "use $mod $ver ()";
228 $errors{$mod} = $@ if $@;
232 my $missing = join (', ', map { $deps->{$_} ? "$_ >= $deps->{$_}" : $_ } (sort keys %errors) );
233 $missing .= " (see $class for details)" if $reqs->{$group}{pod};
234 $req_availability_cache{$group} = {
236 errorlist => { %errors },
241 $req_availability_cache{$group} = {
251 my $modfn = __PACKAGE__ . '.pm';
252 $modfn =~ s/\:\:/\//g;
256 #########################################################################
257 ##################### A U T O G E N E R A T E D ########################
258 #########################################################################
260 # The contents of this POD file are auto-generated. Any changes you make
261 # will be lost. If you need to change the generated text edit _gen_pod()
262 # at the end of $modfn
266 "$class - Optional module dependency specifications",
267 '=head1 DESCRIPTION',
269 Some of the less-frequently used features of L<DBIx::Class> have external
270 module dependencies on their own. In order not to burden the average user
271 with modules he will never use, these optional dependencies are not included
272 in the base Makefile.PL. Instead an exception with a descriptive message is
273 thrown when a specific feature is missing one or several modules required for
274 its operation. This module is the central holding place for the current list
275 of such dependencies.
277 '=head1 CURRENT REQUIREMENT GROUPS',
279 Dependencies are organized in C<groups> and each group can list one or more
280 required modules, with an optional minimum version (or 0 for any version).
281 The group name can be used in the
285 for my $group (sort keys %$reqs) {
286 my $p = $reqs->{$group}{pod}
289 my $modlist = $reqs->{$group}{req}
292 next unless keys %$modlist;
295 "=head2 $p->{title}",
298 ( map { "=item * $_" . ($modlist->{$_} ? " >= $modlist->{$_}" : '') } (sort keys %$modlist) ),
300 "Requirement group: B<$group>",
306 '=head2 req_list_for',
308 '=item Arguments: $group_name',
309 '=item Returns: \%list_of_module_version_pairs',
312 This method should be used by DBIx::Class extension authors, to determine the
313 version of modules which a specific feature requires in the current version of
314 DBIx::Class. For example if you write a module/extension that requires
315 DBIx::Class and also requires the availability of
316 L<DBIx::Class::Storage::DBI/deploy>, you can do the following in your
317 C<Makefile.PL> or C<Build.PL>
320 my \$dep_list = $class->req_list_for ('deploy');
322 Which will give you a list of module/version pairs necessary for the particular
323 feature to function with this version of DBIx::Class.
328 '=item Arguments: $group_name',
329 '=item Returns: 1|0',
331 'Returns true or false depending on whether all modules required by C<$group_name> are present on the system and loadable',
333 '=head2 req_missing_for',
335 '=item Arguments: $group_name',
336 '=item Returns: $error_message_string',
339 Returns a single line string suitable for inclusion in larger error messages.
340 This method would normally be used by DBIx::Class core-module author, to
341 indicate to the user that he needs to install specific modules before he will
342 be able to use a specific feature.
344 For example if the requirements for C<replicated> are not available, the
345 returned string would look like:
347 Moose >= 0.98, MooseX::Types >= 0.21, namespace::clean (see $class for details)
349 The author is expected to prepend the necessary text to this message before
350 returning the actual error seen by the user.
353 '=head2 req_errorlist_for',
355 '=item Arguments: $group_name',
356 '=item Returns: \%list_of_loaderrors_per_module',
359 Returns a hashref containing the actual errors that occured while attempting
360 to load each module in the requirement group.
363 'See L<DBIx::Class/CONTRIBUTORS>.',
365 'You may distribute this code under the same terms as Perl itself',
369 $fn =~ s/\.pm$/\.pod/;
371 open (my $fh, '>', $fn) or croak "Unable to write to $fn: $!";
372 print $fh join ("\n\n", @chunks);