Index: trunk/Nebulous-Server/t/07_server_find_instances.t
===================================================================
--- trunk/Nebulous-Server/t/07_server_find_instances.t	(revision 18400)
+++ trunk/Nebulous-Server/t/07_server_find_instances.t	(revision 18451)
@@ -3,5 +3,5 @@
 # Copryight (C) 2004-2005  Joshua Hoblitt
 #
-# $Id: 07_server_find_instances.t,v 1.13 2008-07-02 03:40:10 jhoblitt Exp $
+# $Id: 07_server_find_instances.t,v 1.14 2008-07-09 23:32:35 jhoblitt Exp $
 
 use strict;
@@ -78,5 +78,5 @@
     my $uri = $neb->create_object('foo', 'node01');
 
-    my $locations = $neb->find_instances('neb://node02/foo', ":any");
+    my $locations = $neb->find_instances('neb://node02/foo', "~any");
 
     uri_scheme_ok($locations->[0], 'file');
@@ -91,5 +91,5 @@
     my $uri2 = $neb->replicate_object("foo");
 
-    my $locations = $neb->find_instances("foo", ":any");
+    my $locations = $neb->find_instances("foo", "~any");
 
     uri_scheme_ok($locations->[0], 'file');
Index: trunk/Nebulous-Server/t/14_server_xattr.t
===================================================================
--- trunk/Nebulous-Server/t/14_server_xattr.t	(revision 18400)
+++ trunk/Nebulous-Server/t/14_server_xattr.t	(revision 18451)
@@ -3,5 +3,5 @@
 # Copryight (C) 2007  Joshua Hoblitt
 #
-# $Id: 14_server_xattr.t,v 1.7 2008-05-15 03:28:05 jhoblitt Exp $
+# $Id: 14_server_xattr.t,v 1.8 2008-07-09 23:32:35 jhoblitt Exp $
 
 use strict;
@@ -164,5 +164,5 @@
     $neb->getxattr_object('foo', 'bar');
 };
-like($@, qr/xattr foo:bar does not exist/,
+like($@, qr|xattr neb:///foo:bar does not exist|,
     "get xattr from non-existant xattr key");
 
Index: trunk/Nebulous-Server/t/75_parse_neb_key.t
===================================================================
--- trunk/Nebulous-Server/t/75_parse_neb_key.t	(revision 18400)
+++ trunk/Nebulous-Server/t/75_parse_neb_key.t	(revision 18451)
@@ -3,5 +3,5 @@
 # Copryight (C) 2004-2005  Joshua Hoblitt
 #
-# $Id: 75_parse_neb_key.t,v 1.3 2008-03-21 01:23:45 jhoblitt Exp $
+# $Id: 75_parse_neb_key.t,v 1.4 2008-07-09 23:32:35 jhoblitt Exp $
 
 use strict;
@@ -10,5 +10,5 @@
 use Test::More;
 
-plan tests => 36;
+plan tests => 80;
 
 use lib qw( ./t ./lib );
@@ -24,104 +24,202 @@
 # key
 {
-    my ($volume, $path) = parse_neb_key('foo/bar/baz/quix');
-
-    is($path, 'foo/bar/baz/quix', 'path');
-    is($volume, undef, 'volume name');
-}
-
-{
-    my ($volume, $path) = parse_neb_key('/foo/bar/baz/quix');
-
-    is($path, 'foo/bar/baz/quix', 'path');
-    is($volume, undef, 'volume name');
-}
-
-{
-    my ($volume, $path) = parse_neb_key('//foo/bar/baz/quix');
-
-    is($path, 'foo/bar/baz/quix', 'path');
-    is($volume, undef, 'volume name');
-}
-
-{
-    my ($volume, $path) = parse_neb_key('///foo/bar/baz/quix');
-
-    is($path, 'foo/bar/baz/quix', 'path');
-    is($volume, undef, 'volume name');
-}
-
-{
-    my ($volume, $path) = parse_neb_key('foo////bar/baz/quix');
-
-    is($path, 'foo/bar/baz/quix', 'path');
-    is($volume, undef, 'volume name');
-}
-
-{
-    my ($volume, $path) = parse_neb_key('foo/bar/baz/quix/');
-
-    is($path, 'foo/bar/baz/quix', 'path');
-    is($volume, undef, 'volume name');
-}
-
+    my $key = parse_neb_key('foo/bar/baz/quix');
+
+    is($key->path, 'foo/bar/baz/quix', 'path');
+    is($key->volume, undef, 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+{
+    my $key = parse_neb_key('/foo/bar/baz/quix');
+
+    is($key->path, 'foo/bar/baz/quix', 'path');
+    is($key->volume, undef, 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+{
+    my $key = parse_neb_key('//foo/bar/baz/quix');
+
+    is($key->path, 'foo/bar/baz/quix', 'path');
+    is($key->volume, undef, 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+{
+    my $key = parse_neb_key('///foo/bar/baz/quix');
+
+    is($key->path, 'foo/bar/baz/quix', 'path');
+    is($key->volume, undef, 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+{
+    my $key = parse_neb_key('foo////bar/baz/quix');
+
+    is($key->path, 'foo/bar/baz/quix', 'path');
+    is($key->volume, undef, 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+{
+    my $key = parse_neb_key('foo/bar/baz/quix/');
+
+    is($key->path, 'foo/bar/baz/quix', 'path');
+    is($key->volume, undef, 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+# key w/ volume argument
+{
+    my $key = parse_neb_key('foo/bar/baz/quix', 'boing');
+
+    is($key->path, 'foo/bar/baz/quix', 'path');
+    is($key->volume, 'boing', 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+{
+    my $key = parse_neb_key('foo/bar/baz/quix', '~boing');
+
+    is($key->path, 'foo/bar/baz/quix', 'path');
+    is($key->volume, 'boing', 'volume name');
+    is($key->soft_volume, 1, 'soft volume name');
+}
 
 # URI w/ volume name
 {
-    my ($volume, $path) = parse_neb_key('neb://foo/bar/baz/quix');
-
-    is($path, 'bar/baz/quix', 'path');
-    is($volume, 'foo', 'volume name');
-}
-
-{
-    my ($volume, $path) = parse_neb_key('neb://foo//bar/baz/quix');
-
-    is($path, 'bar/baz/quix', 'path');
-    is($volume, 'foo', 'volume name');
-}
-
-{
-    my ($volume, $path) = parse_neb_key('neb://foo///bar/baz/quix');
-
-    is($path, 'bar/baz/quix', 'path');
-    is($volume, 'foo', 'volume name');
-}
-
-{
-    my ($volume, $path) = parse_neb_key('neb://foo/bar///baz/quix');
-
-    is($path, 'bar/baz/quix', 'path');
-    is($volume, 'foo', 'volume name');
-}
-
-{
-    my ($volume, $path) = parse_neb_key('neb://foo/bar/baz/quix/');
-
-    is($path, 'bar/baz/quix', 'path');
-    is($volume, 'foo', 'volume name');
-}
-
+    my $key = parse_neb_key('neb://foo/bar/baz/quix');
+
+    is($key->path, 'bar/baz/quix', 'path');
+    is($key->volume, 'foo', 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+{
+    my $key = parse_neb_key('neb://foo//bar/baz/quix');
+
+    is($key->path, 'bar/baz/quix', 'path');
+    is($key->volume, 'foo', 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+{
+    my $key = parse_neb_key('neb://foo///bar/baz/quix');
+
+    is($key->path, 'bar/baz/quix', 'path');
+    is($key->volume, 'foo', 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+{
+    my $key = parse_neb_key('neb://foo/bar///baz/quix');
+
+    is($key->path, 'bar/baz/quix', 'path');
+    is($key->volume, 'foo', 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+{
+    my $key = parse_neb_key('neb://foo/bar/baz/quix/');
+
+    is($key->path, 'bar/baz/quix', 'path');
+    is($key->volume, 'foo', 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+# URI w/ soft volume name
+{
+    my $key = parse_neb_key('neb://~foo/bar/baz/quix/');
+
+    is($key->path, 'bar/baz/quix', 'path');
+    is($key->volume, 'foo', 'volume name');
+    is($key->soft_volume, 1, 'soft volume name');
+}
+
+# URI w/ volume name and volume argument
+{
+    my $key = parse_neb_key('neb://foo/bar/baz/quix', 'boing');
+
+    is($key->path, 'bar/baz/quix', 'path');
+    is($key->volume, 'boing', 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+{
+    my $key = parse_neb_key('neb://foo/bar/baz/quix', '~boing');
+
+    is($key->path, 'bar/baz/quix', 'path');
+    is($key->volume, 'boing', 'volume name');
+    is($key->soft_volume, 1, 'soft volume name');
+}
+
+{
+    my $key = parse_neb_key('neb://foo/bar/baz/quix', undef);
+
+    is($key->path, 'bar/baz/quix', 'path');
+    is($key->volume, 'foo', 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+# URI w/ ~any volume name
+{
+    my $key = parse_neb_key('neb://~any/bar/baz/quix/');
+
+    is($key->path, 'bar/baz/quix', 'path');
+    is($key->volume, undef, 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+# URI w/ any volume argument
+{
+    my $key = parse_neb_key('neb://boing/bar/baz/quix/', 'any');
+
+    is($key->path, 'bar/baz/quix', 'path');
+    is($key->volume, undef, 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+{
+    my $key = parse_neb_key('neb://boing/bar/baz/quix/', '~any');
+
+    is($key->path, 'bar/baz/quix', 'path');
+    is($key->volume, undef, 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+# URI w/ soft volume name
+{
+    my $key = parse_neb_key('neb://~foo/bar/baz/quix/');
+
+    is($key->path, 'bar/baz/quix', 'path');
+    is($key->volume, 'foo', 'volume name');
+    is($key->soft_volume, 1, 'soft volume name');
+}
 
 # URI w/o volume name
 
 {
-    my ($volume, $path) = parse_neb_key('neb:/foo/bar/baz/quix');
-
-    is($path, 'foo/bar/baz/quix', 'path');
-    is($volume, undef, 'volume name');
-}
-
-{
-    my ($volume, $path) = parse_neb_key('neb:///foo/bar/baz/quix');
-
-    is($volume, undef, 'volume name');
-    is($path, 'foo/bar/baz/quix', 'path');
-}
-
-{
-    my ($volume, $path) = parse_neb_key('neb://///foo/bar/baz/quix');
-
-    is($path, 'foo/bar/baz/quix', 'path');
-    is($volume, undef, 'volume name');
+    my $key = parse_neb_key('neb:/foo/bar/baz/quix');
+
+    is($key->path, 'foo/bar/baz/quix', 'path');
+    is($key->volume, undef, 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+{
+    my $key = parse_neb_key('neb:///foo/bar/baz/quix');
+
+    is($key->volume, undef, 'volume name');
+    is($key->path, 'foo/bar/baz/quix', 'path');
+    is($key->soft_volume, undef, 'soft volume name');
+}
+
+{
+    my $key = parse_neb_key('neb://///foo/bar/baz/quix');
+
+    is($key->path, 'foo/bar/baz/quix', 'path');
+    is($key->volume, undef, 'volume name');
+    is($key->soft_volume, undef, 'soft volume name');
 }
 
@@ -166,5 +264,5 @@
 # URI w/o volume requires leading slash
 eval {
-    my ($volume, $path) = parse_neb_key('neb:foo/bar/baz/quix');
+    my $key = parse_neb_key('neb:foo/bar/baz/quix');
 };
 like( $@, qr/requires a leading slash/, "leading slash" );
