74776e2cc95050dfec2680090ed941e089c66a4a
[p5sagit/Config-Any.git] / lib / Config / Any / General.pm
1 package Config::Any::General;
2
3 use strict;
4 use warnings;
5
6 use base 'Config::Any::Base';
7
8 =head1 NAME
9
10 Config::Any::General - Load Config::General files
11
12 =head1 DESCRIPTION
13
14 Loads Config::General files. Example:
15
16     name = TestApp
17     <Component Controller::Foo>
18         foo bar
19         bar [ arrayref-value ]
20     </Component>
21     <Model Baz>
22         qux xyzzy
23     </Model>
24
25 =head1 METHODS
26
27 =head2 extensions( )
28
29 return an array of valid extensions (C<cnf>, C<conf>).
30
31 =cut
32
33 sub extensions {
34     return qw( cnf conf );
35 }
36
37 =head2 load( $file )
38
39 Attempts to load C<$file> via Config::General.
40
41 =cut
42
43 sub load {
44     my $class = shift;
45     my $file  = shift;
46     my $args  = shift || {};
47
48     # work around bug (?) in Config::General
49     #   return if $class->_test_perl($file);
50
51     $args->{ -ConfigFile } = $file;
52
53     require Config::General;
54
55     if (Config::General->VERSION < 2.47) {
56         die "Config::General version 2.47 or greater required";
57     }
58
59     $args->{ -ForceArray } = 1 unless exists $args->{ -ForceArray };
60
61     my $configfile = Config::General->new( %$args );
62     my $config     = { $configfile->getall };
63
64     return $config;
65 }
66
67 # this is a bit of a hack but necessary, because Config::General is *far* too lax
68 # about what it will load -- specifically, it seems to be quite happy to load a Perl
69 # config file (ie, a file which is valid Perl and creates a hashref) as if it were
70 # an Apache-style configuration file, presumably due to laziness on the part of the
71 # developer.
72
73 sub _test_perl {
74     my ( $class, $file ) = @_;
75     my $is_perl_src;
76     eval { $is_perl_src = do "$file"; };
77     delete $INC{ $file };    # so we don't screw stuff later on
78     return defined $is_perl_src;
79 }
80
81 =head2 requires_all_of( )
82
83 Specifies that this module requires L<Config::General> in order to work.
84
85 =cut
86
87 sub requires_all_of { 'Config::General' }
88
89 =head1 AUTHOR
90
91 Brian Cassidy E<lt>bricas@cpan.orgE<gt>
92
93 =head1 CONTRIBUTORS
94
95 Joel Bernstein C<< <rataxis@cpan.org> >>
96
97 =head1 COPYRIGHT AND LICENSE
98
99 Copyright 2006-2010 by Brian Cassidy
100
101 Portions Copyright 2006 Portugal Telecom
102
103 This library is free software; you can redistribute it and/or modify
104 it under the same terms as Perl itself. 
105
106 =head1 SEE ALSO
107
108 =over 4 
109
110 =item * L<Catalyst>
111
112 =item * L<Config::Any>
113
114 =item * L<Config::General>
115
116 =back
117
118 =cut
119
120 1;
121