-package Config::Any::XML;\r
-\r
-use strict;\r
-use warnings;\r
-\r
-=head1 NAME\r
-\r
-Config::Any::XML - Load XML config files\r
-\r
-=head1 DESCRIPTION\r
-\r
-Loads XML files. Example:\r
-\r
- <config>\r
- <name>TestApp</name>\r
- <component name="Controller::Foo">\r
- <foo>bar</foo>\r
- </component>\r
- <model name="Baz">\r
- <qux>xyzzy</qux>\r
- </model>\r
- </config>\r
-\r
-=head1 METHODS\r
-\r
-=head2 extensions( )\r
-\r
-return an array of valid extensions (C<xml>).\r
-\r
-=cut\r
-\r
-sub extensions {\r
- return qw( xml );\r
-}\r
-\r
-=head2 load( $file )\r
-\r
-Attempts to load C<$file> as an XML file.\r
-\r
-=cut\r
-\r
-sub load {\r
- my $class = shift;\r
- my $file = shift;\r
-\r
- require XML::Simple;\r
- XML::Simple->import;\r
- my $config = XMLin( $file, ForceArray => [ qw( component model view controller ) ] );\r
-\r
- return $config;\r
-}\r
-\r
-=head1 AUTHOR\r
-\r
-=over 4 \r
-\r
-=item * Brian Cassidy E<lt>bricas@cpan.orgE<gt>\r
-\r
-=back\r
-\r
-=head1 COPYRIGHT AND LICENSE\r
-\r
-Copyright 2006 by Brian Cassidy\r
-\r
-This library is free software; you can redistribute it and/or modify\r
-it under the same terms as Perl itself. \r
-\r
-=head1 SEE ALSO\r
-\r
-=over 4 \r
-\r
-=item * L<Catalyst>\r
-\r
-=item * L<Config::Any>\r
-\r
-=item * L<XML::Simple>\r
-\r
-=back\r
-\r
-=cut\r
-\r
-1;
\ No newline at end of file
+package Config::Any::XML;
+
+use strict;
+use warnings;
+
+use base 'Config::Any::Base';
+
+=head1 NAME
+
+Config::Any::XML - Load XML config files
+
+=head1 DESCRIPTION
+
+Loads XML files. Example:
+
+ <config>
+ <name>TestApp</name>
+ <component name="Controller::Foo">
+ <foo>bar</foo>
+ </component>
+ <model name="Baz">
+ <qux>xyzzy</qux>
+ </model>
+ </config>
+
+=head1 METHODS
+
+=head2 extensions( )
+
+return an array of valid extensions (C<xml>).
+
+=cut
+
+sub extensions {
+ return qw( xml );
+}
+
+=head2 load( $file )
+
+Attempts to load C<$file> as an XML file.
+
+=cut
+
+sub load {
+ my $class = shift;
+ my $file = shift;
+ my $args = shift || {};
+
+ require XML::Simple;
+ my $config = XML::Simple::XMLin(
+ $file,
+ ForceArray => [ qw( component model view controller ) ],
+ %$args
+ );
+
+ return $class->_coerce( $config );
+}
+
+sub _coerce {
+
+ # coerce the XML-parsed config into the correct format
+ my $class = shift;
+ my $config = shift;
+ my $out;
+ for my $k ( keys %$config ) {
+ my $ref = $config->{ $k };
+ my $name = ref $ref ? delete $ref->{ name } : undef;
+ if ( defined $name ) {
+ $out->{ $k }->{ $name } = $ref;
+ }
+ else {
+ $out->{ $k } = $ref;
+ }
+ }
+ $out;
+}
+
+=head2 requires_all_of( )
+
+Specifies that this module requires L<XML::Simple> in order to work.
+
+=cut
+
+sub requires_all_of { 'XML::Simple' }
+
+=head1 CAVEATS
+
+=head2 Strict Mode
+
+If, by some chance, L<XML::Simple> has already been loaded with the strict
+flag turned on, then you will likely get errors as warnings will become
+fatal exceptions and certain arguments to XMLin() will no longer be optional.
+
+See L<XML::Simple's strict mode documentation|XML::Simple/STRICT_MODE> for
+more information.
+
+=head1 AUTHORS
+
+Brian Cassidy E<lt>bricas@cpan.orgE<gt>
+
+Joel Bernstein E<lt>rataxis@cpan.orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2007 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<Catalyst>
+
+=item * L<Config::Any>
+
+=item * L<XML::Simple>
+
+=back
+
+=cut
+
+1;