remove eval so the Perl loader dies on invalid content.
[p5sagit/Config-Any.git] / lib / Config / Any / XML.pm
1 package Config::Any::XML;
2
3 use strict;
4 use warnings;
5
6 =head1 NAME
7
8 Config::Any::XML - Load XML config files
9
10 =head1 DESCRIPTION
11
12 Loads XML files. Example:
13
14     <config>
15         <name>TestApp</name>
16         <component name="Controller::Foo">
17             <foo>bar</foo>
18         </component>
19         <model name="Baz">
20             <qux>xyzzy</qux>
21         </model>
22     </config>
23
24 =head1 METHODS
25
26 =head2 extensions( )
27
28 return an array of valid extensions (C<xml>).
29
30 =cut
31
32 sub extensions {
33     return qw( xml );
34 }
35
36 =head2 load( $file )
37
38 Attempts to load C<$file> as an XML file.
39
40 =cut
41
42 sub load {
43     my $class = shift;
44     my $file  = shift;
45     my $args  = shift || {};
46
47     require XML::Simple;
48     my $config = XML::Simple::XMLin(
49         $file,
50         ForceArray => [ qw( component model view controller ) ],
51         %$args
52     );
53
54     return $class->_coerce( $config );
55 }
56
57 sub _coerce {
58
59     # coerce the XML-parsed config into the correct format
60     my $class  = shift;
61     my $config = shift;
62     my $out;
63     for my $k ( keys %$config ) {
64         my $ref = $config->{ $k };
65         my $name = ref $ref ? delete $ref->{ name } : undef;
66         if ( defined $name ) {
67             $out->{ $k }->{ $name } = $ref;
68         }
69         else {
70             $out->{ $k } = $ref;
71         }
72     }
73     $out;
74 }
75
76 =head2 is_supported( )
77
78 Returns true if L<XML::Simple> is available.
79
80 =cut
81
82 sub is_supported {
83     eval { require XML::Simple; };
84     return $@ ? 0 : 1;
85 }
86
87 =head1 AUTHORS
88
89 Brian Cassidy E<lt>bricas@cpan.orgE<gt>
90
91 Joel Bernstein E<lt>rataxis@cpan.orgE<gt>
92
93 =head1 COPYRIGHT AND LICENSE
94
95 Copyright 2007 by Brian Cassidy
96
97 This library is free software; you can redistribute it and/or modify
98 it under the same terms as Perl itself. 
99
100 =head1 SEE ALSO
101
102 =over 4 
103
104 =item * L<Catalyst>
105
106 =item * L<Config::Any>
107
108 =item * L<XML::Simple>
109
110 =back
111
112 =cut
113
114 1;