File Coverage

blib/lib/Atomik/Element.pm
Criterion Covered Total %
statement 6 12 50.0
branch 0 2 0.0
condition n/a
subroutine 2 3 66.6
pod n/a
total 8 17 47.0


line stmt bran cond sub pod time code
1             # $Id: /mirror/coderepos/lang/perl/Atomik/trunk/lib/Atomik/Element.pm 68160 2008-08-10T23:55:31.147997Z daisuke $
2              
3             package Atomik::Element;
4 1     1   7 use Moose;
  1         3  
  1         9  
5              
6             has 'storage' => ( is => 'rw', does => 'Atomik::Storage' );
7              
8             has 'namespace' => (
9             is => 'rw',
10             isa => 'Str',
11             );
12              
13             has 'version' => (
14             is => 'rw',
15             isa => 'Num',
16             );
17              
18 1     1   7885 no Moose;
  1         4  
  1         7  
19              
20             my %NS2VERSION = (
21             "http://purl.org/atom/ns#" => '0.3',
22             "http://www.w3.org/2005/Atom" => '1.0',
23             "http://www.w3.org/2007/app" => '1.0', # AtomPub
24             );
25              
26             sub BUILD {
27 0     0     my $self = shift;
28              
29 0 0         if (my $node = $self->node) {
30 0           my $namespace = $node->namespaceURI();
31 0           $self->namespace( $namespace );
32 0           $self->version( $NS2VERSION{ $namespace } );
33             }
34 0           return $self;
35             }
36              
37             sub from_any {
38             my ($class, $any) = @_;
39              
40             confess "no argument given to from_any" unless $any;
41              
42             my $blessed = Scalar::Util::blessed $any;
43             if ($blessed) {
44             if ($any->can('toString')) {
45             return $class->from_xml($any->toString());
46             } elsif ($any->can('as_xml')) {
47             return $class->from_xml($any->as_xml());
48             }
49              
50             confess "don't know how to handle $any";
51             }
52              
53             my $reftype = Scalar::Util::reftype $any || '';
54             if (! $reftype) {
55             confess "XXX - Later (from file)";
56             }
57              
58             if ($reftype eq 'SCALAR') {
59             return $class->from_xml($$any);
60             }
61              
62             confess "don't know how to handle $any";
63             }
64              
65             sub element_get {
66             my ($self, %args) = @_;
67              
68             my @nodes = $self->storage->findnodes_from_tagname(
69             tag => $args{tag},
70             namespace => $args{namespace},
71             strip => 1,
72             );
73              
74             return wantarray ? @nodes : $nodes[0];
75             }
76              
77              
78             sub __mk_element_accessor {
79             my $class = shift;
80             my $element = shift;
81             my $code = sprintf(<<'EOSUB', blessed $class || $class, $element, $element);
82             sub %s::%s {
83             my $self = shift;
84             my $namespace = $self->namespace;
85             my $tag = '%s';
86             return @_ ?
87             $self->element_set(namespace => $namespace, tag => $tag, value => $_[0]) :
88             $self->element_get(namespace => $namespace, tag => $tag);
89             }
90             EOSUB
91             eval $code;
92             confess $@ if $@;
93             }
94              
95              
96             # These accessors must differ how they act depending on if the feed is
97             1;