update is_supported with YAML::Syck version
[p5sagit/Config-Any.git] / lib / Config / Any / XML.pm
CommitLineData
f0e3c221 1package Config::Any::XML;
2
3use strict;
4use warnings;
5
6=head1 NAME
7
8Config::Any::XML - Load XML config files
9
10=head1 DESCRIPTION
11
12Loads 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
28return an array of valid extensions (C<xml>).
29
30=cut
31
32sub extensions {
33 return qw( xml );
34}
35
36=head2 load( $file )
37
38Attempts to load C<$file> as an XML file.
39
40=cut
41
42sub load {
43 my $class = shift;
44 my $file = shift;
7d9d2803 45 my $args = shift || {};
f0e3c221 46
47 require XML::Simple;
92a04e78 48 my $config = XML::Simple::XMLin(
49 $file,
f0e3c221 50 ForceArray => [ qw( component model view controller ) ],
7d9d2803 51 %$args
f0e3c221 52 );
53
92a04e78 54 return $class->_coerce( $config );
f0e3c221 55}
56
57sub _coerce {
92a04e78 58
f0e3c221 59 # coerce the XML-parsed config into the correct format
92a04e78 60 my $class = shift;
f0e3c221 61 my $config = shift;
62 my $out;
92a04e78 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;
f0e3c221 71 }
72 }
73 $out;
74}
75
72628dc7 76=head2 is_supported( )
77
78Returns true if L<XML::Simple> is available.
79
80=cut
81
82sub is_supported {
83 eval { require XML::Simple; };
84 return $@ ? 0 : 1;
85}
86
a918b0b8 87=head1 AUTHORS
f0e3c221 88
a918b0b8 89Brian Cassidy E<lt>bricas@cpan.orgE<gt>
f0e3c221 90
a918b0b8 91Joel Bernstein E<lt>rataxis@cpan.orgE<gt>
f0e3c221 92
93=head1 COPYRIGHT AND LICENSE
94
a918b0b8 95Copyright 2007 by Brian Cassidy
f0e3c221 96
97This library is free software; you can redistribute it and/or modify
98it 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
1141;