package Data::Feed::Atom::Entry; use Any::Moose; use Data::Feed::Web::Content; use XML::Atom::Entry; has entry => ( is => 'rw', isa => 'XML::Atom::Entry', required => 1, lazy_build => 1, handles => [ qw(title updated) ] ); # Apply after has entry, so that title() and updated() are respected with 'Data::Feed::Web::Entry'; __PACKAGE__->meta->make_immutable; no Any::Moose; sub _build_entry { return XML::Atom::Entry->new() } sub link { my $entry = shift; if (@_) { return $entry->entry->add_link({ rel => 'alternate', href => $_[0], type => 'text/html', }); } else { foreach my $link ($entry->entry->link) { if (defined $link && ! defined $link->rel || $link->rel eq 'alternate' ) { return $link->href; } } } return (); } sub links { my $entry = shift; return $entry->entry->link; } sub summary { my $entry = shift; if (@_) { $entry->entry->summary( (Scalar::Util::blessed($_[0]) || '') eq 'Data:::Feed::Web::Content' ? $_[0]->body : $_[0] ); } else { Data::Feed::Web::Content->new( type => 'html', body => $entry->entry->summary || '' ); } } sub content { my $entry = shift; if (@_) { my %param; if (Scalar::Util::blessed $_[0] && $_[0]->isa('Data::Feed::Web::Content')) { %param = (Body => $_[0]->body); } else { %param = (Body => $_[0]); } $entry->entry->content(XML::Atom::Content->new(%param, Version => 1.0)); } else { my $c = $entry->entry->content; # map Atom types to MIME types my $type = $c ? $c->type : 'text'; if ($type) { $type = 'text/html' if $type eq 'xhtml' || $type eq 'html'; $type = 'text/plain' if $type eq 'text'; } Data::Feed::Web::Content->new( type => $type, body => $c ? $c->body : '' ); } } sub category { my $entry = shift; my $ns = XML::Atom::Namespace->new(dc => 'http://purl.org/dc/elements/1.1/'); if (@_) { $entry->entry->add_category({ term => $_[0] }); } else { my $category = $entry->entry->category; $category ? ($category->label || $category->term) : $entry->entry->get($ns, 'subject'); } } sub author { my $entry = shift; if (@_ && $_[0]) { my $person = XML::Atom::Person->new(Namespace => $entry->entry->ns, Version => 1.0); $person->name($_[0]); $entry->entry->author($person); } else { $entry->entry->author ? $entry->entry->author->name : undef; } } sub id { shift->entry->id(@_) } sub issued { my $entry = shift; if (@_) { $entry->entry->issued(DateTime::Format::W3CDTF->format_datetime($_[0])) if $_[0]; } else { Data::Feed->parse_datetime($entry->entry->issued); } } sub modified { my $entry = shift; if (@_) { $entry->entry->modified(DateTime::Format::W3CDTF->format_datetime($_[0])) if $_[0]; } else { Data::Feed->parse_w3cdtf_date($entry->entry->modified); } } sub enclosures { my $self = shift; die if @_; my @enclosures; for my $link ( grep { defined $_->rel && $_->rel eq 'enclosure' } $self->entry->link ) { my $enclosure = Data::Feed::Web::Enclosure->new( url => $link->href, ); $enclosure->length($link->length) if $link->length; $enclosure->type($link->type) if $link->type; push @enclosures, $enclosure; } @enclosures; } sub extract_node_values { my ($self, $tagname, $namespace) = @_; $tagname = "$namespace:$tagname" if $namespace; my @elements = map { $_->textContent } $self->entry->{elem}->getElementsByTagName( $tagname ); return @elements; } 1; __END__ =head1 NAME Data::Feed::Atom::Entry - An Atom Entry =head1 METHODS =head2 author =head2 category =head2 content =head2 enclosures =head2 id =head2 issued =head2 link =head2 modified =head2 summary =head2 title =head2 @values = extract_node_values( $tagname, $namespace ) Attempts to extract value(s) of a random child node specified by the $tagname and $namespace =cut