Add support for extracting activity bits from Atom entries too.
Mark Atkins [Wed, 7 Jan 2009 22:31:19 +0000 (22:31 +0000)]
lib/XML/Feed/Format/Atom.pm

index 7bd84cd..9f53b82 100644 (file)
@@ -134,6 +134,11 @@ use XML::Feed::Content;
 use XML::Atom::Entry;
 use List::Util qw( first );
 
+use constant ACTIVITY_NAMESPACE_URI => "http://activitystrea.ms/spec/1.0/";
+use constant ACTIVITY_NAMESPACE => XML::Atom::Namespace->new(
+    'activity' => ACTIVITY_NAMESPACE_URI,
+);
+
 sub init_empty {
     my $entry = shift;
     $entry->{entry} = XML::Atom::Entry->new(Version => 1.0);
@@ -293,4 +298,76 @@ sub long {
     }
 }
 
+sub activity_verbs {
+    my $entry = shift->{entry};
+
+    if (@_) {
+        my @verbs = @_;
+
+        # Remove all of the existing verb elements.
+        my @existing_verbs = XML::Atom::Util::childlist($entry->elem, ACTIVITY_NAMESPACE_URI(), 'verb');
+        foreach my $elem (@existing_verbs) {
+            $entry->elem->removeChild($elem);
+        }
+
+        foreach my $verb (@verbs) {
+            $entry->set(ACTIVITY_NAMESPACE(), 'verb', $verb, undef, 1);
+        }
+    }
+    else {
+        # FIXME: This currently returns all decendent verbs, not just
+        # children. This might get troublesome if, for example,
+        # there's ever an activity entry with an activity as its
+        # object, or something crazy like that.
+        return $entry->getlist(ACTIVITY_NAMESPACE(), 'verb');
+    }
+}
+
+sub activity_object_types {
+    my $entry = shift->{entry};
+
+    if (@_) {
+        my @types = @_;
+
+        # Remove all of the existing type elements.
+        my @existing_types = XML::Atom::Util::childlist($entry->elem, ACTIVITY_NAMESPACE_URI(), 'object-type');
+        foreach my $elem (@existing_types) {
+            $entry->elem->removeChild($elem);
+        }
+
+        foreach my $type (@types) {
+            $entry->set(ACTIVITY_NAMESPACE(), 'object-type', $type, undef, 1);
+        }
+    }
+    else {
+        # FIXME: This currently returns all decendent types, not just
+        # children. This means that it'll erroneously return
+        # an activity:object-type nested inside an activity:object.
+        return $entry->getlist(ACTIVITY_NAMESPACE(), 'object-type');
+    }
+}
+
+sub activity_object {
+    my $entry = shift->{entry};
+
+    if (@_) {
+        # Need to accept any arbitrary XML::Feed::Entry and turn it into
+        # an XML::Atom::Entry here, then call:
+        # $entry->set(ACTIVITY_NAMESPACE, 'object', $xml_atom_entry);
+        die "setting activity_object is not yet implemented";
+    } else {
+        my ($object_elem) = XML::Atom::Util::childlist($entry->elem, ACTIVITY_NAMESPACE_URI(), 'object');
+        if (defined $object_elem) {
+            my $ret = XML::Atom::Entry->new(Elem => $object_elem);
+            # If we're holding an activity:object element then our primary
+            # namespace will be set wrong, so let's put it back.
+            XML::Atom::Util::set_ns($ret, { Version => "1.0" });
+            return XML::Feed::Entry::Format::Atom->wrap($ret);
+        }
+        else {
+            return undef;
+        }
+    }
+}
+
 1;