Index: trunk/Nebulous/lib/Nebulous/Client.pm
===================================================================
--- trunk/Nebulous/lib/Nebulous/Client.pm	(revision 17610)
+++ trunk/Nebulous/lib/Nebulous/Client.pm	(revision 17645)
@@ -1,5 +1,5 @@
 # Copyright (c) 2004-2008  Joshua Hoblitt
 #
-# $Id: Client.pm,v 1.46 2008-05-09 21:15:07 jhoblitt Exp $
+# $Id: Client.pm,v 1.47 2008-05-13 00:27:28 jhoblitt Exp $
 
 package Nebulous::Client;
@@ -104,5 +104,5 @@
         },
         {
-            type        => SCALAR,
+            type        => SCALAR|UNDEF,
             optional    => 1,
         },
@@ -416,4 +416,133 @@
 }
 
+
+sub setxattr_object
+{
+    my $self = shift;
+
+    my ($key, $name, $value, $flags) = validate_pos(@_,
+        {
+            type        => SCALAR,
+        },
+        {
+            type        => SCALAR,
+        },
+        {
+            type        => SCALAR,
+        },
+        {
+            type        => SCALAR,
+            callbacks   => {
+                'is read or write' => sub { $_[0] =~ /^(?:create|replace)$/i },
+            },
+        },
+    );
+
+    $log->debug( "entered - @_" );
+
+    my $response = $self->{ 'server' }->setxattr_object( $key, $name, $value, $flags);
+    if ( $response->fault ) {
+        $log->error( $response->faultcode, " - ", $response->faultstring );
+        $log->debug( "leaving" );
+
+        return;
+    }
+
+    $log->debug( "leaving" );
+    
+    return 1;
+}
+
+
+sub getxattr_object
+{
+    my $self = shift;
+
+    my ($key, $name) = validate_pos(@_,
+        {
+            type        => SCALAR,
+        },
+        {
+            type        => SCALAR,
+        },
+    );
+
+    $log->debug( "entered - @_" );
+
+    my $response = $self->{ 'server' }->getxattr_object( $key, $name );
+    if ( $response->fault ) {
+        $log->error( $response->faultcode, " - ", $response->faultstring );
+        $log->debug( "leaving" );
+
+        return;
+    }
+
+    my $res = $response->result;
+    $log->debug( "server response: $res" );
+
+    $log->debug( "leaving" );
+    
+    return $res;
+}
+
+
+sub listxattr_object
+{
+    my $self = shift;
+
+    my ($key) = validate_pos(@_,
+        {
+            type        => SCALAR,
+        },
+    );
+
+    $log->debug( "entered - @_" );
+
+    my $response = $self->{ 'server' }->listxattr_object( $key );
+    if ( $response->fault ) {
+        $log->error( $response->faultcode, " - ", $response->faultstring );
+        $log->debug( "leaving" );
+
+        return;
+    }
+
+    my $res = $response->result;
+    $log->debug( "server response: $res" );
+
+    $log->debug( "leaving" );
+    
+    return $res;
+}
+
+
+sub removexattr_object
+{
+    my $self = shift;
+
+    my ($key, $name) = validate_pos(@_,
+        {
+            type        => SCALAR,
+        },
+        {
+            type        => SCALAR,
+        },
+    );
+
+    $log->debug( "entered - @_" );
+
+    my $response = $self->{ 'server' }->removexattr_object( $key, $name );
+    if ( $response->fault ) {
+        $log->error( $response->faultcode, " - ", $response->faultstring );
+        $log->debug( "leaving" );
+
+        return;
+    }
+
+    $log->debug( "leaving" );
+    
+    return 1;
+}
+
+
 sub find_objects {
     my $self = shift;
