# $Id: /mirror/coderepos/lang/perl/Atomik/trunk/lib/Atomik/Element.pm 68160 2008-08-10T23:55:31.147997Z daisuke $ package Atomik::Element; use Moose; has 'storage' => ( is => 'rw', does => 'Atomik::Storage' ); has 'namespace' => ( is => 'rw', isa => 'Str', ); has 'version' => ( is => 'rw', isa => 'Num', ); no Moose; my %NS2VERSION = ( "http://purl.org/atom/ns#" => '0.3', "http://www.w3.org/2005/Atom" => '1.0', "http://www.w3.org/2007/app" => '1.0', # AtomPub ); sub BUILD { my $self = shift; if (my $node = $self->node) { my $namespace = $node->namespaceURI(); $self->namespace( $namespace ); $self->version( $NS2VERSION{ $namespace } ); } return $self; } sub from_any { my ($class, $any) = @_; confess "no argument given to from_any" unless $any; my $blessed = Scalar::Util::blessed $any; if ($blessed) { if ($any->can('toString')) { return $class->from_xml($any->toString()); } elsif ($any->can('as_xml')) { return $class->from_xml($any->as_xml()); } confess "don't know how to handle $any"; } my $reftype = Scalar::Util::reftype $any || ''; if (! $reftype) { confess "XXX - Later (from file)"; } if ($reftype eq 'SCALAR') { return $class->from_xml($$any); } confess "don't know how to handle $any"; } sub element_get { my ($self, %args) = @_; my @nodes = $self->storage->findnodes_from_tagname( tag => $args{tag}, namespace => $args{namespace}, strip => 1, ); return wantarray ? @nodes : $nodes[0]; } sub __mk_element_accessor { my $class = shift; my $element = shift; my $code = sprintf(<<'EOSUB', blessed $class || $class, $element, $element); sub %s::%s { my $self = shift; my $namespace = $self->namespace; my $tag = '%s'; return @_ ? $self->element_set(namespace => $namespace, tag => $tag, value => $_[0]) : $self->element_get(namespace => $namespace, tag => $tag); } EOSUB eval $code; confess $@ if $@; } # These accessors must differ how they act depending on if the feed is 1;