Commit | Line | Data |
dcfb1d1d |
1 | package Config::Any::Base; |
2 | |
3 | use strict; |
4 | use warnings; |
5 | |
6 | =head1 NAME |
7 | |
8 | Config::Any::Base - Base class for loaders |
9 | |
10 | =head1 DESCRIPTION |
11 | |
12 | This is a base class for all loaders. It currently handles the specification |
13 | of dependencies in order to ensure the subclass can load the config file |
14 | format. |
15 | |
16 | =head1 METHODS |
17 | |
18 | =head2 is_supported( ) |
19 | |
20 | Allows us to determine if the file format can be loaded. The can be done via |
a3997560 |
21 | one of two subclass methods: |
dcfb1d1d |
22 | |
23 | =over 4 |
24 | |
25 | =item * C<requires_all_of()> - returns an array of items that must all be present in order to work |
26 | |
27 | =item * C<requires_any_of()> - returns an array of items in which at least one must be present |
28 | |
29 | =back |
30 | |
31 | You can specify a module version by passing an array reference in the return. |
32 | |
33 | sub requires_all_of { [ 'My::Module', '1.1' ], 'My::OtherModule' } |
34 | |
35 | Lack of specifying these subs will assume you require no extra modules to function. |
36 | |
37 | =cut |
38 | |
39 | sub is_supported { |
40 | my ( $class ) = shift; |
3f3b3137 |
41 | local $@; |
dcfb1d1d |
42 | if ( $class->can( 'requires_all_of' ) ) { |
3f3b3137 |
43 | return eval { |
44 | _require($_) for $class->requires_all_of; |
45 | 1; |
46 | } || 0; |
dcfb1d1d |
47 | } |
48 | if ( $class->can( 'requires_any_of' ) ) { |
3f3b3137 |
49 | eval { _require( $_ ); 1 } and return 1 |
50 | for $class->requires_any_of; |
dcfb1d1d |
51 | return 0; |
52 | } |
53 | |
54 | # requires nothing! |
55 | return 1; |
56 | } |
57 | |
3f3b3137 |
58 | sub _require { |
dcfb1d1d |
59 | my ( $input ) = shift; |
60 | my ( $module, $version ) = ( ref $input ? @$input : $input ); |
3f3b3137 |
61 | (my $file = "$module.pm") =~ s{::}{/}g; |
62 | require $file; |
63 | $module->VERSION if $version; |
dcfb1d1d |
64 | } |
65 | |
66 | =head1 AUTHOR |
67 | |
20190ef7 |
68 | Brian Cassidy <bricas@cpan.org> |
dcfb1d1d |
69 | |
70 | =head1 COPYRIGHT AND LICENSE |
71 | |
c793253e |
72 | Copyright 2008-2009 by Brian Cassidy |
dcfb1d1d |
73 | |
74 | This library is free software; you can redistribute it and/or modify |
19f6cb63 |
75 | it under the same terms as Perl itself. |
dcfb1d1d |
76 | |
77 | =head1 SEE ALSO |
78 | |
19f6cb63 |
79 | =over 4 |
dcfb1d1d |
80 | |
81 | =item * L<Config::Any> |
82 | |
83 | =back |
84 | |
85 | =cut |
86 | |
87 | 1; |