Index: trunk/bkmk
===================================================================
--- trunk/bkmk	(revision 83)
+++ trunk/bkmk	(revision 85)
@@ -31,8 +31,6 @@
     get => sub {
         my $identifier = shift;
-        my $query = $identifier =~ /^\d+$/ ? { id => $identifier } : { uri => $identifier };
-        my $bookmark = $bookmarks->get_bookmark($query);
-
-        print $bookmark ? Dump($bookmark) : "Not Found\n";
+        my $bookmark = find_bookmark($identifier);
+        print $bookmark ? Dump($bookmark->TO_JSON) : "Not Found\n";
     },
     
@@ -41,16 +39,30 @@
         my $title = defined $TITLE ? $TITLE : fetch_title($uri);
         my $bookmark = $bookmarks->add({ uri => $uri, title => $title, tags => \@tags });
-        print Dump($bookmark);
+        print Dump($bookmark->TO_JSON);
     },
 
     list => sub {
         my @tags = @_;
-        my @resources = $bookmarks->get_bookmarks({
-            tag => \@tags
+        my $resources = $bookmarks->get_bookmarks({
+            tags => \@tags
         });
         # TODO: list by tags, date, etc.
         # TODO: coordinate this commandline script with the CGI app
-        print Dump(\@resources);
+        print Dump([ map { $_->TO_JSON } @{ $resources->results } ]);
     },
+
+    tag => sub {
+        my ($identifier, @tags) = @_;
+        my $bookmark = find_bookmark($identifier);
+        if ($bookmark) {
+            $bookmark->tags(\@tags);
+            $bookmarks->update($bookmark);
+            print Dump($bookmark->TO_JSON);
+        } else {
+            die "Not found\n";
+        }
+    },
+
+    #TODO: interactive editing of a bookmark
 
     # bulk loading
@@ -66,4 +78,10 @@
 $action_for{$command}->(@ARGV);
 
+sub find_bookmark {
+    my $identifier = shift;
+    my $query = $identifier =~ /^\d+$/ ? { id => $identifier } : { uri => $identifier };
+    return $bookmarks->get_bookmark($query);
+}
+
 sub fetch_title {
     my $uri = shift;
