File Coverage

blib/lib/XML/Atom/Thing.pm
Criterion Covered Total %
statement 61 86 70.9
branch 17 36 47.2
condition 2 12 16.6
subroutine 16 17 94.1
pod 0 4 0.0
total 96 155 61.9


line stmt bran cond sub pod time code
1             # $Id$
2              
3             package XML::Atom::Thing;
4 19     19   160 use strict;
  19         70  
  19         667  
5 19     19   99 use base qw( XML::Atom::Base );
  19         38  
  19         8517  
6              
7 19     19   186 use XML::Atom;
  19         43  
  19         1003  
8 19     19   164 use base qw( XML::Atom::ErrorHandler );
  19         35  
  19         760  
9 19     19   111 use XML::Atom::Util qw( first nodelist childlist create_element );
  19         33  
  19         984  
10 19     19   8860 use XML::Atom::Category;
  19         49  
  19         566  
11 19     19   8196 use XML::Atom::Link;
  19         60  
  19         562  
12 19     19   12576 use LWP::UserAgent;
  19         764794  
  19         1317  
13             BEGIN {
14 19     19   75 if (LIBXML) {
15 19         12636 *init = \&init_libxml;
16             } else {
17             *init = \&init_xpath;
18             }
19             }
20              
21             sub init_libxml {
22 102     102 0 181 my $atom = shift;
23 102 100       356 my %param = @_ == 1 ? (Stream => $_[0]) : @_;
24 102 100       382 if (my $stream = delete $param{Stream}) {
    50          
25 17   66     151 my $parser = delete $param{Parser} || XML::Atom->libxml_parser;
26 17         1796 my $doc;
27 17 100       76 if (ref($stream) eq 'SCALAR') {
    100          
28 8         34 $doc = $parser->parse_string($$stream);
29             } elsif (ref($stream)) {
30 1         5 $doc = $parser->parse_fh($stream);
31             } else {
32 8         37 $doc = $parser->parse_file($stream);
33             }
34 17         8224 $param{Elem} = $doc->getDocumentElement;
35             } elsif (my $doc = delete $param{Doc}) {
36 0         0 $param{Elem} = $doc->getDocumentElement;
37             }
38 102         465 $atom->SUPER::init(%param);
39 102         368 $atom->fixup_ns;
40 102         407 return $atom;
41             }
42              
43             sub fixup_ns {
44 102     102 0 161 my $obj = shift;
45 102         308 $obj->{ns} = $obj->elem->namespaceURI;
46             }
47              
48             sub init_xpath {
49 0     0 0 0 my $atom = shift;
50 0 0       0 my %param = @_ == 1 ? (Stream => $_[0]) : @_;
51 0         0 my $elem_name = $atom->element_name;
52 0 0       0 if (my $stream = delete $param{Stream}) {
    0          
    0          
53 0   0     0 my $parser = delete $param{Parser} || XML::Atom->expat_parser;
54 0         0 my $xp;
55 0 0       0 if (ref($stream) eq 'SCALAR') {
    0          
56 0         0 $xp = XML::XPath->new(xml => $$stream, parser => $parser);
57             } elsif (ref($stream)) {
58 0         0 $xp = XML::XPath->new(ioref => $stream, parser => $parser);
59             } else {
60 0         0 $xp = XML::XPath->new(filename => $stream, parser => $parser);
61             }
62 0         0 my $set = $xp->find('/' . $elem_name);
63 0 0 0     0 unless ($set && $set->size) {
64 0         0 $set = $xp->find('/');
65             }
66 0         0 $param{Elem} = ($set->get_nodelist)[0];
67             } elsif (my $doc = delete $param{Doc}) {
68 0         0 $param{Elem} = $doc;
69             } elsif (my $elem = $param{Elem}) {
70 0         0 my $xp = XML::XPath->new(context => $elem);
71 0         0 my $set = $xp->find('/' . $elem_name);
72 0 0 0     0 unless ($set && $set->size) {
73 0         0 $set = $xp->find('/');
74             }
75 0         0 $param{Elem} = ($set->get_nodelist)[0];
76             }
77 0         0 $atom->SUPER::init(%param);
78 0         0 $atom;
79             }
80              
81             sub set {
82 35     35 0 1431 my $atom = shift;
83 35         98 my($ns, $name, $val, $attr, $add) = @_;
84 35 50       131 if (ref($val) =~ /Element$/) {
85 0         0 $atom->elem->appendChild($val);
86 0         0 return $val;
87             } else {
88 35         190 return $atom->SUPER::set(@_);
89             }
90             }
91              
92             # common elements
93             __PACKAGE__->mk_elem_accessors(qw( icon id logo title )); # updated & rights are in renamed
94              
95             # common multiple elements
96             __PACKAGE__->mk_object_list_accessor('link' => 'XML::Atom::Link', 'links');
97             __PACKAGE__->mk_object_list_accessor('category' => 'XML::Atom::Category', 'categories');
98             __PACKAGE__->mk_object_list_accessor('author' => 'XML::Atom::Person', 'authors');
99             __PACKAGE__->mk_object_list_accessor('contributor' => 'XML::Atom::Person', 'contributors');
100              
101             __PACKAGE__->_rename_elements('copyright' => 'rights');
102              
103             # 0.3 -> 1.0 elements aliasing
104             sub _rename_elements {
105 95     95   241 my($class, $atom03, $atom10) = @_;
106 19     19   216 no strict 'refs';
  19         46  
  19         4713  
107 95         414 *{"$class\::$atom03"} = sub {
108 13     13   1250 my $self = shift;
109 13 100       42 if ($self->version eq "1.0") {
110 5         23 return $self->$atom10(@_);
111             }
112 8 100       82 @_ > 0 ? $self->set($self->ns, $atom03, @_) : $self->get($self->ns, $atom03);
113 95         340 };
114              
115 95         463 *{"$class\::$atom10"} = sub {
116 10     10   21 my $self = shift;
117 10 100       23 if ($self->version eq "0.3") {
118 1         4 return $self->$atom03(@_);
119             }
120 9 50       34 @_ > 0 ? $self->set($self->ns, $atom10, @_) : $self->get($self->ns, $atom10);
121 95         355 };
122             }
123              
124             1;