--- /dev/null
+use strict;
+use warnings;
+use v5.10;
+
+=head1 DESCRIPTION
+
+Given a URL of an Atom or RSS feed or a filename of an already downloaded
+feed, this script will try to parse it and print out what it understands
+from the feed.
+
+=cut
+
+use XML::Feed;
+
+my $src = shift;
+
+die "Usage: $0 FILE|URL\n" if not $src;
+
+my $source = $src;
+if ($src =~ m{^https?://}) {
+ $source = URI->new($src);
+} else {
+ if (not -f $source) {
+ die "'$source' does not look like a URL and it does not exist on the file-system either.\n";
+ }
+}
+
+my $feed = XML::Feed->parse( $source ) or die XML::Feed->errstr;
+say 'Title: ' . ($feed->title // '');
+say 'Tagline: ' . ($feed->tagline // '');
+say 'Format: ' . ($feed->format // '');
+say 'Author: ' . ($feed->author // '');
+say 'Link: ' . ($feed->link // '');
+say 'Base: ' . ($feed->base // '');
+say 'Language: ' . ($feed->language // '');
+say 'Copyright: ' . ($feed->copyright // '');
+say 'Modified: ' . ($feed->modified // ''); # DateTime object
+say 'Generator: ' . ($feed->generator // '');
+
+for my $entry ($feed->entries) {
+ say '';
+ say ' Link: ' . ($entry->link // '');
+ say ' Author: ' . ($entry->author // '');
+ say ' Title: ' . ($entry->title // '');
+ say ' Caregory: ' . ($entry->category // '');
+ say ' Id: ' . ($entry->id // '');
+ say ' Issued: ' . ($entry->issued // ''); # DateTime object
+ say ' Modified: ' . ($entry->modified // ''); # DateTime object
+ say ' Lat: ' . ($entry->lat // '');
+ say ' Long: ' . ($entry->long // '');
+ say ' Format: ' . ($entry->format // '');
+ say ' Tags: ' . ($entry->tags // '');
+ say ' Enclosure: ' . ($entry->enclosure // '');
+ say ' Summary: ' . ($entry->summary->body // '');
+ say ' Content: ' . ($entry->content->body // '');
+}
+