Index: /trunk/DataStore/MANIFEST
===================================================================
--- /trunk/DataStore/MANIFEST	(revision 6537)
+++ /trunk/DataStore/MANIFEST	(revision 6538)
@@ -18,2 +18,3 @@
 t/03_file_parse.t
 t/04_record.t
+t/05_product.t
Index: /trunk/DataStore/lib/DataStore/Product.pm
===================================================================
--- /trunk/DataStore/lib/DataStore/Product.pm	(revision 6537)
+++ /trunk/DataStore/lib/DataStore/Product.pm	(revision 6538)
@@ -1,5 +1,5 @@
 # Copyright (C) 2006  Joshua Hoblitt
 #
-# $Id: Product.pm,v 1.1 2006-02-28 03:03:34 jhoblitt Exp $
+# $Id: Product.pm,v 1.2 2006-03-08 00:02:43 jhoblitt Exp $
 
 package DataStore::Product;
@@ -77,5 +77,5 @@
                 type        => SCALAR,
                 callbacks   => {
-                    'uri ends with /'   => sub { $_[0] =~ m|/$| },
+                    'is valid uri dirname'   => sub { $_[0] =~ m|/$| },
 
                 }
@@ -86,4 +86,5 @@
                     'is valid fileset ID' => sub { $_[0] =~ $std_field },
                 },
+                optional    => 1,
             },
         },
@@ -101,7 +102,13 @@
 =over 4
 
-=item * C<foo()>
+=item * C<request()>
 
 =cut
+
+sub request 
+{
+
+}
+
 
 1;
Index: /trunk/DataStore/t/05_product.t
===================================================================
--- /trunk/DataStore/t/05_product.t	(revision 6538)
+++ /trunk/DataStore/t/05_product.t	(revision 6538)
@@ -0,0 +1,100 @@
+#!/usr/bin/env perl
+
+# Copyright (C) 2006  Joshua Hoblitt
+#
+# $Id: 05_product.t,v 1.1 2006-03-08 00:02:43 jhoblitt Exp $
+
+use strict;
+use warnings;
+
+use lib qw( ./lib ./t );
+
+use Test::More tests => 10;
+
+=head1 NAME
+
+t/05_product.t - tests DataStore::Product
+
+=head1 SYNOPSIS
+    
+    prove t/05_product.t
+
+=cut
+
+use DataStore::Product;
+
+can_ok('DataStore::Product', qw(
+    new
+    request
+));
+
+# ->new()
+
+{
+    my $dsp = DataStore::Product->new( uri => 'http://example.org/' );
+
+    isa_ok($dsp, 'DataStore::Product');
+}
+
+{
+    my $dsp = DataStore::Product->new(
+        uri             => 'http://example.org/',
+        last_fileset    => '12buckelyourshoe',
+    );
+
+    isa_ok($dsp, 'DataStore::Product');
+}
+
+eval {
+    my $dsp = DataStore::Product->new( uri => 'http://example.org/', foo => 1 );
+};
+like($@, qr/not listed in the validation options/,
+    '->new() fails whe passed extra params');
+
+eval {
+    my $dsp = DataStore::Product->new(
+        uri             => 'http://example.org/',
+        last_fileset    => '12buckelyourshoe',
+        foo => 1,
+    );
+};
+like($@, qr/not listed in the validation options/,
+    '->new() fails whe passed extra params');
+
+eval {
+    my $dsp = DataStore::Product->new( uri => 'http://example.org' );
+};
+like($@, qr/is valid uri dirname/,
+    '->new() fails when uri param does not end with /');
+
+eval {
+    my $dsp = DataStore::Product->new( uri => '://example.org' );
+};
+like($@, qr/is valid http uri/,
+    '->new() fails when uri param is not http protocol');
+
+eval {
+    my $dsp = DataStore::Product->new(
+        uri             => 'http://example.org/',
+        last_fileset    => '++12buckelyourshoe',
+    );
+};
+like($@, qr/is valid fileset ID/,
+    '->new() fails when last_fileset param is not a valid fileset ID');
+
+eval {
+    my $dsp = DataStore::Product->new;
+};
+like($@, qr/Mandatory parameter 'uri'/,
+    '->new() fails when not passed a uri param');
+
+eval {
+    my $dsp = DataStore::Product->new(
+        last_fileset    => '12buckelyourshoe',
+    );
+};
+like($@, qr/Mandatory parameter 'uri'/,
+    '->new() fails when not passed a uri param');
+
+# ->request()
+
