diff -ruN XML-Atom-0.16.orig/lib/XML/Atom/Category.pm XML-Atom-0.16/lib/XML/Atom/Category.pm
--- XML-Atom-0.16.orig/lib/XML/Atom/Category.pm	1970-01-01 09:00:00.000000000 +0900
+++ XML-Atom-0.16/lib/XML/Atom/Category.pm	2006-02-07 22:51:57.000000000 +0900
@@ -0,0 +1,93 @@
+# $Id$
+
+package XML::Atom::Category;
+use strict;
+
+use XML::Atom;
+use XML::Atom::Util qw( set_ns );
+use base qw( XML::Atom::ErrorHandler );
+
+sub new {
+    my $class = shift;
+    my $category = bless {}, $class;
+    $category->init(@_) or return $class->error($category->errstr);
+    $category;
+}
+
+sub init {
+    my $category = shift;
+    my %param = @_ == 1 ? (Body => $_[0]) : @_;
+    $category->set_ns(\%param);
+    my $elem;
+    unless ($elem = $param{Elem}) {
+        if (LIBXML) {
+            my $doc = XML::LibXML::Document->createDocument('1.0', 'utf-8');
+            $elem = $doc->createElementNS($category->ns, 'category');
+            $doc->setDocumentElement($elem);
+        } else {
+            $elem = XML::XPath::Node::Element->new('category');
+            my $ns = XML::XPath::Node::Namespace->new('#default' => $category->ns);
+            $elem->appendNamespace($ns);
+        }
+    }
+    $category->{elem} = $elem;
+    $category;
+}
+
+sub ns   { $_[0]->{ns} }
+sub elem { $_[0]->{elem} }
+
+sub get {
+    my $category = shift;
+    my($attr) = @_;
+    my $val = $category->elem->getAttribute($attr);
+    if ($] >= 5.008) {
+        require Encode;
+        Encode::_utf8_off($val);
+    }
+    $val;
+}
+
+sub set {
+    my $category = shift;
+    if (@_ == 2) {
+	my($attr, $val) = @_;
+	$category->elem->setAttribute($attr, $val);
+    } elsif (@_ == 3) {
+	my($ns, $attr, $val) = @_;
+	my $attribute = "$ns->{prefix}:$attr";
+	if (LIBXML) {
+	    $category->elem->setAttributeNS($ns->{uri}, $attribute, $val);
+	} else {
+	    my $ns = XML::XPath::Node::Namespace->new($ns->{prefix} => $ns->{uri});
+            $category->elem->appendNamespace($ns);
+	    $category->elem->setAttribute($attribute => $val);
+	}
+    }
+}
+
+sub as_xml {
+    my $category = shift;
+    if (LIBXML) {
+        my $doc = XML::LibXML::Document->new('1.0', 'utf-8');
+        $doc->setDocumentElement($category->elem);
+        return $doc->toString(1);
+    } else {
+        return '<?xml version="1.0" encoding="utf-8"?>' . "\n" .
+            $category->elem->toString;
+    }
+}
+
+sub DESTROY { }
+
+use vars qw( $AUTOLOAD );
+sub AUTOLOAD {
+    (my $var = $AUTOLOAD) =~ s!.+::!!;
+    no strict 'refs';
+    *$AUTOLOAD = sub {
+        @_ > 1 ? $_[0]->set($var, @_[1..$#_]) : $_[0]->get($var)
+    };
+    goto &$AUTOLOAD;
+}
+
+1;
diff -ruN XML-Atom-0.16.orig/lib/XML/Atom/Thing.pm XML-Atom-0.16/lib/XML/Atom/Thing.pm
--- XML-Atom-0.16.orig/lib/XML/Atom/Thing.pm	2006-02-07 22:51:33.000000000 +0900
+++ XML-Atom-0.16/lib/XML/Atom/Thing.pm	2006-02-07 23:50:34.000000000 +0900
@@ -7,6 +7,7 @@
 use base qw( XML::Atom::ErrorHandler );
 use XML::Atom::Util qw( set_ns first nodelist remove_default_ns );
 use XML::Atom::Link;
+use XML::Atom::Category;
 use LWP::UserAgent;
 BEGIN {
     if (LIBXML) {
@@ -261,6 +262,11 @@
     }
 }
 
+sub category {
+    my $thing = shift;
+    $thing->_element('XML::Atom::Category', 'category', @_);
+}
+
 sub author {
     my $thing = shift;
     $thing->_element('XML::Atom::Person', 'author', @_);
