X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=p5sagit%2FConfig-Any.git;a=blobdiff_plain;f=lib%2FConfig%2FAny%2FINI.pm;h=68e3f06f8876554025bb4b6362e53f7c395f32f1;hp=a091ba953bb8abcd7cc408dd59e2ac6dd1d17a2e;hb=5a2e0210fe5c7da046be37b4240008f2b667be67;hpb=e967a60fa6fb5adeb6ead013b0b60289b2a92e2e diff --git a/lib/Config/Any/INI.pm b/lib/Config/Any/INI.pm index a091ba9..68e3f06 100644 --- a/lib/Config/Any/INI.pm +++ b/lib/Config/Any/INI.pm @@ -1,96 +1,123 @@ -package Config::Any::INI; - -use strict; -use warnings; - -=head1 NAME - -Config::Any::INI - Load INI config files - -=head1 DESCRIPTION - -Loads INI files. Example: - - name=TestApp - - [Controller::Foo] - foo=bar - - [Model::Baz] - qux=xyzzy - -=head1 METHODS - -=head2 extensions( ) - -return an array of valid extensions (C). - -=cut - -sub extensions { - return qw( ini ); -} - -=head2 load( $file ) - -Attempts to load C<$file> as an INI file. - -=cut - -sub load { - my $class = shift; - my $file = shift; - - require Config::Tiny; - my $config = Config::Tiny->read( $file ); - - my $main = delete $config->{ _ }; - my $out; - $out->{$_} = $main->{$_} for keys %$main; - - for my $k (keys %$config) { - my @keys = split /\s+/, $k; - my $ref = $config->{$k}; - - if (@keys > 1) { - my ($a, $b) = @keys[0,1]; - $out->{$a}->{$b} = $ref; - } else { - $out->{$k} = $ref; - } - } - return $out; -} - -=head1 AUTHOR - -=over 4 - -=item * Brian Cassidy Ebricas@cpan.orgE - -=item * Joel Bernstein Erataxis@cpan.orgE - -=back - -=head1 COPYRIGHT AND LICENSE - -Copyright 2006 by Brian Cassidy - -This library is free software; you can redistribute it and/or modify -it under the same terms as Perl itself. - -=head1 SEE ALSO - -=over 4 - -=item * L - -=item * L - -=item * L - -=back - -=cut - -1; +package Config::Any::INI; + +use strict; +use warnings; + +our $MAP_SECTION_SPACE_TO_NESTED_KEY = 1; + +=head1 NAME + +Config::Any::INI - Load INI config files + +=head1 DESCRIPTION + +Loads INI files. Example: + + name=TestApp + + [Controller::Foo] + foo=bar + + [Model::Baz] + qux=xyzzy + +=head1 METHODS + +=head2 extensions( ) + +return an array of valid extensions (C). + +=cut + +sub extensions { + return qw( ini ); +} + +=head2 load( $file ) + +Attempts to load C<$file> as an INI file. + +=cut + +sub load { + my $class = shift; + my $file = shift; + + require Config::Tiny; + my $config = Config::Tiny->read( $file ); + my $out = delete $config->{ _ } || {}; + + for my $k ( keys %$config ) { + my @keys = split /\s+/, $k; + my $ref = $config->{ $k }; + + if ( $MAP_SECTION_SPACE_TO_NESTED_KEY && @keys > 1 ) { + my ( $a, $b ) = @keys[ 0, 1 ]; + $out->{ $a }->{ $b } = $ref; + } + else { + $out->{ $k } = { %{ $out->{ $k } || {} }, %$ref }; + } + } + + return $out; +} + +=head2 is_supported( ) + +Returns true if L is available. + +=cut + +sub is_supported { + eval { require Config::Tiny; }; + return $@ ? 0 : 1; +} + +=head1 PACKAGE VARIABLES + +=over 4 + +=item $MAP_SECTION_SPACE_TO_NESTED_KEY (boolean) + +This variable controls whether spaces in INI section headings will be expanded into nested hash keys. +e.g. it controls whether [Full Power] maps to $config->{'Full Power'} or $config->{'Full'}->{'Power'} + +By default it is set to 1 (i.e. true). + +Set it to 0 to preserve literal spaces in section headings: + + use Config::Any; + use Config::Any::INI; + $Config::Any::INI::MAP_SECTION_SPACE_TO_NESTED_KEY = 0; + +=back + +=head1 AUTHORS + +Brian Cassidy Ebricas@cpan.orgE + +Joel Bernstein Erataxis@cpan.orgE + +=head1 COPYRIGHT AND LICENSE + +Copyright 2007 by Brian Cassidy, portions copyright 2006, 2007 by Joel Bernstein + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 SEE ALSO + +=over 4 + +=item * L + +=item * L + +=item * L + +=back + +=cut + +1;