The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Plagger::Plugin::Filter::AtomLinkRelated;
use strict;
use base qw( Plagger::Plugin );

use List::Util qw(first);

sub register {
    my($self, $context) = @_;
    $context->register_hook(
        $self,
        'aggregator.entry.fixup' => \&fixup,
    );
}

# Note: Bloglines doesn't return link rel="related" value in its API and we're doomed

sub fixup {
    my($self, $context, $args) = @_;

    # Use Atom's link rel="related"
    if (my $orig_link = $args->{orig_feed}->format eq 'Atom') {
        my $rel = first { $_->rel eq 'related' } $args->{orig_entry}->{entry}->link; # XXX uses XML::Feed internal
        if ($rel) {
            $args->{entry}->link($rel->href);
            $context->log(info => "Link rewritten to " . $rel->href);
        }
    }
}

1;

__END__

=head1 NAME

Plagger::Plugin::Filter::AtomLinkRelated - Use link rel="related" as entry link

=head1 SYNOPSIS

  - module: Filter::AtomLinkRelated

=head1 DESCRIPTION

This plugin looks for Atom link elements with C<< rel="related" >>
relationship set. This way you can use original link defined in Social
Bookmark atom feeds like L<http://b.hatena.ne.jp/miyagawa/atomfeed>.

Note that this plugin only works with Plagger's own aggregator like
I<Aggregator::Simple> plugin, since Bloglines API doesn't return
related links in its response data.

=head1 AUTHOR

Tatsuhiko Miyagawa

=head1 SEE ALSO

L<Plagger>

=cut