Index: /trunk/DataStore/MANIFEST
===================================================================
--- /trunk/DataStore/MANIFEST	(revision 6500)
+++ /trunk/DataStore/MANIFEST	(revision 6501)
@@ -7,6 +7,10 @@
 README
 Todo
+lib/DataStore/File.pm
 lib/DataStore/File/Parser.pm
+lib/DataStore/FileSet.pm
 lib/DataStore/FileSet/Parser.pm
+lib/DataStore/Product.pm
+lib/DataStore/Record.pm
 t/00_distribution.t
 t/01_load.t
Index: /trunk/DataStore/lib/DataStore/File.pm
===================================================================
--- /trunk/DataStore/lib/DataStore/File.pm	(revision 6501)
+++ /trunk/DataStore/lib/DataStore/File.pm	(revision 6501)
@@ -0,0 +1,81 @@
+# Copyright (C) 2006  Joshua Hoblitt
+#
+# $Id: File.pm,v 1.1 2006-02-28 03:03:14 jhoblitt Exp $
+
+package DataStore::File;
+
+use strict;
+use warnings;
+
+use vars qw($VERSION);
+$VERSION = '0.01';
+
+use base qw( DataStore::Record );
+
+use Params::Validate qw( validate SCALAR );
+
+use vars qw( @BASE_FIELDS );
+
+@BASE_FIELDS = qw( fileid bytes md5sum type );
+
+__PACKAGE__->mk_accessors(@BASE_FIELDS);
+
+=pod
+
+=head1 NAME
+
+DataStore::File - represents a DataStore File
+
+=head1 SYNOPSIS
+
+    use DataStore::file;
+
+    my $dsf = DateStore::File->new(...);
+
+=head1 DESCRIPTION
+
+=head1 USAGE
+
+=head2 Import Parameters
+
+This module accepts no arguments to it's C<import> method and exports no
+I<symbols>.
+
+=head2 Methods
+
+=head3 Constructors
+
+=over 4
+
+=item * C<new()>
+
+=cut
+
+sub new
+{
+    my $class = shift;
+
+    # validates uri, ignores other params
+    my $self = $class->SUPER::new(@_);
+
+    my %p = validate(@_,
+        {
+            uri         => 1,
+            fileid      => 1,
+            bytes       => 1,
+            md5sum      => 1,
+            type        => 1,
+        },
+    );
+
+    $self->{fileid} = $p{fileid};
+    $self->{bytes}  = $p{bytes};
+    $self->{md5sum} = $p{md5sum};
+    $self->{type}   = $p{type};
+
+    return $self;
+}
+
+1;
+
+__END__
Index: /trunk/DataStore/lib/DataStore/File/Parser.pm
===================================================================
--- /trunk/DataStore/lib/DataStore/File/Parser.pm	(revision 6500)
+++ /trunk/DataStore/lib/DataStore/File/Parser.pm	(revision 6501)
@@ -1,5 +1,5 @@
 # Copyright (C) 2006  Joshua Hoblitt
 #
-# $Id: Parser.pm,v 1.5 2006-02-27 22:32:00 jhoblitt Exp $
+# $Id: Parser.pm,v 1.6 2006-02-28 03:02:12 jhoblitt Exp $
 
 package DataStore::File::Parser;
@@ -14,6 +14,6 @@
 
 use Carp qw( carp );
-use DataStore::Record;
-use Params::Validate qw( validate_pos SCALAR);
+use DataStore::File;
+use Params::Validate qw( validate validate_pos SCALAR );
 
 my $std_field = qr/^[a-z0-9-_.]+$/;
@@ -63,5 +63,17 @@
     my $class = shift;
 
-    my $self = bless {}, ref $class || $class;
+    my %p = validate(@_,
+        {
+            base_uri => {
+                type        => SCALAR,
+                callbacks   => {
+                    'is valid http uri' => sub { is_http_uri($_[0]) },
+                },
+                default =>  'http://example.org/',
+            },
+        },
+    );
+
+    my $self = bless \%p, ref $class || $class;
 
     return $self;
@@ -141,9 +153,10 @@
 
         # fifo  
-        push @data, DataStore::Record::File->new({
+        push @data, DataStore::File->new({
             fileid  => $fileid,
             bytes   => $bytes,
             md5sum  => $md5sum,
             type    => $type,
+            uri     => $self->base_uri . $fileid,
         });
     } continue {
Index: /trunk/DataStore/lib/DataStore/FileSet.pm
===================================================================
--- /trunk/DataStore/lib/DataStore/FileSet.pm	(revision 6501)
+++ /trunk/DataStore/lib/DataStore/FileSet.pm	(revision 6501)
@@ -0,0 +1,85 @@
+# Copyright (C) 2006  Joshua Hoblitt
+#
+# $Id: FileSet.pm,v 1.1 2006-02-28 03:03:14 jhoblitt Exp $
+
+package DataStore::FileSet;
+
+use strict;
+use warnings;
+
+use vars qw($VERSION);
+$VERSION = '0.01';
+
+use base qw( DataStore::Record );
+
+use Params::Validate qw( validate SCALAR );
+
+use vars qw( @BASE_FIELDS );
+
+@BASE_FIELDS = qw( fileset datetime type );
+
+__PACKAGE__->mk_accessors(@BASE_FIELDS);
+
+=pod
+
+=head1 NAME
+
+DataStore::FileSet - represents a DataStore FileSet 
+
+=head1 SYNOPSIS
+
+    use DataStore::FileSet;
+
+    my $dsfs = DateStore::FileSet->new(...);
+
+=head1 DESCRIPTION
+
+=head1 USAGE
+
+=head2 Import Parameters
+
+This module accepts no arguments to it's C<import> method and exports no
+I<symbols>.
+
+=head2 Methods
+
+=head3 Constructors
+
+=over 4
+
+=item * C<new()>
+
+=cut
+
+sub new
+{
+    my $class = shift;
+
+    # validates uri, ignores other params
+    my $self = $class->SUPER::new(@_);
+
+    my %p = validate(@_,
+        {
+            uri             => {
+                type        => SCALAR,
+                callbacks   => {
+                    'uri ends with /'   => sub { $_[0] =~ m|/$| },
+
+                },
+            },
+            fileset     => 1,
+            datetime    => 1,
+            type        => 1,
+        },
+    );
+
+    $self->{fileset}    = $p{fileset};
+    $self->{datetime}   = $p{datetime};
+    $self->{type}       = $p{type};
+
+    return $self;
+}
+
+1;
+
+__END__
Index: /trunk/DataStore/lib/DataStore/FileSet/Parser.pm
===================================================================
--- /trunk/DataStore/lib/DataStore/FileSet/Parser.pm	(revision 6500)
+++ /trunk/DataStore/lib/DataStore/FileSet/Parser.pm	(revision 6501)
@@ -1,5 +1,5 @@
 # Copyright (C) 2006  Joshua Hoblitt
 #
-# $Id: Parser.pm,v 1.6 2006-02-27 22:32:00 jhoblitt Exp $
+# $Id: Parser.pm,v 1.7 2006-02-28 03:02:12 jhoblitt Exp $
 
 package DataStore::FileSet::Parser;
@@ -15,5 +15,5 @@
 use Carp qw( carp );
 use Data::Validate::URI qw( is_http_uri );
-use DataStore::Record;
+use DataStore::FileSet;
 use Params::Validate qw( validate validate_pos SCALAR);
 
@@ -152,9 +152,9 @@
 
         # fifo
-        push @data, DataStore::Record::FileSet->new({
+        push @data, DataStore::FileSet->new({
             fileset     => $fileset,
             datetime    => $datetime,
             type        => $type,
-            uri         => $self->base_uri . $fileset,
+            uri         => $self->base_uri . $fileset . '/',
         });
     } continue {
Index: /trunk/DataStore/lib/DataStore/Product.pm
===================================================================
--- /trunk/DataStore/lib/DataStore/Product.pm	(revision 6501)
+++ /trunk/DataStore/lib/DataStore/Product.pm	(revision 6501)
@@ -0,0 +1,109 @@
+# Copyright (C) 2006  Joshua Hoblitt
+#
+# $Id: Product.pm,v 1.1 2006-02-28 03:03:34 jhoblitt Exp $
+
+package DataStore::Product;
+
+use strict;
+use warnings;
+
+use vars qw($VERSION);
+$VERSION = '0.01';
+
+use base qw( DataStore::Record );
+
+use Carp qw( carp );
+use DataStore::Record;
+use Params::Validate qw( validate SCALAR);
+
+my $std_field = qr/^[a-z0-9-_.]+$/;
+
+use vars qw( @BASE_FIELDS );
+
+@BASE_FIELDS = qw( last_fileset );
+
+__PACKAGE__->mk_ro_accessors(@BASE_FIELDS);
+
+=pod
+
+=head1 NAME
+
+DataStore::Product - represents a DataStore Product ID
+
+=head1 SYNOPSIS
+
+    use DataStore::Product;
+
+    my $dsp = DataStore::Product->new(
+        uri             => 'http://example.com/productid/',
+        last_fileset    => 'foobar',
+    );
+
+    my DataStore::Response $response = $dsp->fetch;
+
+=head1 DESCRIPTION
+
+=head1 USAGE
+
+=head2 Import Parameters
+
+This module accepts no arguments to it's C<import> method and exports no
+I<symbols>.
+
+=head2 Methods
+
+=head3 Constructors
+
+=over 4
+
+=item * C<new()>
+
+Basic constructor.
+
+Accepts no arguments and returns a L<DataStore::Product> object.
+
+=cut
+
+sub new
+{
+    my $class = shift;
+
+    # validates uri, ignores other params
+    my $self = $class->SUPER::new(@_);
+
+    my %p = validate(@_,
+        {
+            uri             => {
+                type        => SCALAR,
+                callbacks   => {
+                    'uri ends with /'   => sub { $_[0] =~ m|/$| },
+
+                }
+            },
+            last_fileset    => { 
+                type        => SCALAR,
+                callbacks   => {
+                    'is valid fileset ID' => sub { $_[0] =~ $std_field },
+                },
+            },
+        },
+    );
+
+    $self->{last_fileset} = $p{last_fileset};
+
+    return $self;
+}
+
+=back
+
+=head3 Object Methods
+
+=over 4
+
+=item * C<foo()>
+
+=cut
+
+1;
+
+__END__
Index: /trunk/DataStore/lib/DataStore/Record.pm
===================================================================
--- /trunk/DataStore/lib/DataStore/Record.pm	(revision 6500)
+++ /trunk/DataStore/lib/DataStore/Record.pm	(revision 6501)
@@ -1,5 +1,5 @@
 # Copyright (C) 2006  Joshua Hoblitt
 #
-# $Id: Record.pm,v 1.1 2006-02-27 22:32:00 jhoblitt Exp $
+# $Id: Record.pm,v 1.2 2006-02-28 03:02:12 jhoblitt Exp $
 
 package DataStore::Record;
@@ -15,5 +15,5 @@
 use Carp qw( carp );
 use Data::Validate::URI qw( is_http_uri );
-use Params::Validate qw( validate validate_pos SCALAR);
+use Params::Validate qw( validate_with validate SCALAR );
 
 use vars qw( @BASE_FIELDS );
@@ -44,4 +44,35 @@
 =head2 Methods
 
+=head3 Constructors
+
+=over 4
+
+=cut
+
+sub new
+{
+    my $class = shift;
+
+    my %p = validate_with(
+        params  => \@_,
+        spec    => {
+            uri => {
+                type        => SCALAR,
+                callbacks   => {
+                    'is valid http uri' => sub { is_http_uri($_[0]) },
+                },
+                default =>  'http://example.org/',
+            },
+        },
+        allow_extra => 1,
+    );
+
+    my $self = bless { uri => $p{uri} }, ref $class || $class;
+
+    return $self;
+}
+
+=back
+
 =head3 Object Methods
 
@@ -52,25 +83,4 @@
 =cut
 
-package DataStore::Record::FileSet;
-
-use base qw( DataStore::Record );
-
-use vars qw( @BASE_FIELDS );
-
-@BASE_FIELDS = qw( fileset datetime type );
-
-__PACKAGE__->mk_accessors(@BASE_FIELDS);
-
-
-package DataStore::Record::File;
-
-use base qw( DataStore::Record );
-
-use vars qw( @BASE_FIELDS );
-
-@BASE_FIELDS = qw( fileid bytes md5sum type );
-
-__PACKAGE__->mk_accessors(@BASE_FIELDS);
-
 1;
 
Index: /trunk/DataStore/t/01_load.t
===================================================================
--- /trunk/DataStore/t/01_load.t	(revision 6500)
+++ /trunk/DataStore/t/01_load.t	(revision 6501)
@@ -3,7 +3,12 @@
 # t/001_load.t - check module loading and create testing directory
 
-use Test::More tests => 2;
+use lib qw( ./lib ./t );
 
+use Test::More tests => 6;
+
+BEGIN { use_ok( 'DataStore::File' ); }
 BEGIN { use_ok( 'DataStore::File::Parser' ); }
+BEGIN { use_ok( 'DataStore::FileSet' ); }
 BEGIN { use_ok( 'DataStore::FileSet::Parser' ); }
-
+BEGIN { use_ok( 'DataStore::Product' ); }
+BEGIN { use_ok( 'DataStore::Record' ); }
Index: /trunk/DataStore/t/02_fileset_parse.t
===================================================================
--- /trunk/DataStore/t/02_fileset_parse.t	(revision 6500)
+++ /trunk/DataStore/t/02_fileset_parse.t	(revision 6501)
@@ -3,5 +3,5 @@
 # Copyright (C) 2006  Joshua Hoblitt
 #
-# $Id: 02_fileset_parse.t,v 1.4 2006-02-25 04:48:25 jhoblitt Exp $
+# $Id: 02_fileset_parse.t,v 1.5 2006-02-28 03:02:12 jhoblitt Exp $
 
 use strict;
@@ -121,27 +121,27 @@
     is(scalar @$results, 4, "correct number of item returned");
 
-    isa_ok(@$results[0], 'DataStore::FileSet::Record');
+    isa_ok(@$results[0], 'DataStore::FileSet');
     is(@$results[0]->fileset, 'otis0123456', 'correct fileset');
     is(@$results[0]->datetime, '2006-01-01T00:03:04Z', 'correct datetime');
     is(@$results[0]->type, 'object', 'correct type');
-    is(@$results[0]->uri, 'http://foo.com/otis0123456', 'correct uri');
+    is(@$results[0]->uri, 'http://foo.com/otis0123456/', 'correct uri');
 
-    isa_ok(@$results[1], 'DataStore::FileSet::Record');
+    isa_ok(@$results[1], 'DataStore::FileSet');
     is(@$results[1]->fileset, 'otis0123456', 'correct fileset');
     is(@$results[1]->datetime, '2006-01-01T00:03:04Z', 'correct datetime');
     is(@$results[1]->type, 'object', 'correct type');
-    is(@$results[1]->uri, 'http://foo.com/otis0123456', 'correct uri');
+    is(@$results[1]->uri, 'http://foo.com/otis0123456/', 'correct uri');
 
-    isa_ok(@$results[2], 'DataStore::FileSet::Record');
+    isa_ok(@$results[2], 'DataStore::FileSet');
     is(@$results[2]->fileset, 'otis0123456', 'correct fileset');
     is(@$results[2]->datetime, '2006-01-01T00:03:04Z', 'correct datetime');
     is(@$results[2]->type, 'object', 'correct type');
-    is(@$results[2]->uri, 'http://foo.com/otis0123456', 'correct uri');
+    is(@$results[2]->uri, 'http://foo.com/otis0123456/', 'correct uri');
 
-    isa_ok(@$results[3], 'DataStore::FileSet::Record');
+    isa_ok(@$results[3], 'DataStore::FileSet');
     is(@$results[3]->fileset, 'otis0123456', 'correct fileset');
     is(@$results[3]->datetime, '2006-01-01T00:03:04Z', 'correct datetime');
     is(@$results[3]->type, 'object', 'correct type');
-    is(@$results[3]->uri, 'http://foo.com/otis0123456', 'correct uri');
+    is(@$results[3]->uri, 'http://foo.com/otis0123456/', 'correct uri');
 }
 
@@ -164,5 +164,5 @@
     is(scalar @$results, 1, "correct number of item returned");
 
-    isa_ok(@$results[0], 'DataStore::FileSet::Record');
+    isa_ok(@$results[0], 'DataStore::FileSet');
     is(@$results[0]->fileset, 'otis0123456', 'correct fileset');
     is(@$results[0]->datetime, '2006-01-01T00:03:04Z', 'correct datetime');
Index: /trunk/DataStore/t/03_file_parse.t
===================================================================
--- /trunk/DataStore/t/03_file_parse.t	(revision 6500)
+++ /trunk/DataStore/t/03_file_parse.t	(revision 6501)
@@ -3,5 +3,5 @@
 # Copyright (C) 2006  Joshua Hoblitt
 #
-# $Id: 03_file_parse.t,v 1.2 2006-02-25 00:13:36 jhoblitt Exp $
+# $Id: 03_file_parse.t,v 1.3 2006-02-28 03:02:12 jhoblitt Exp $
 
 use strict;
@@ -132,5 +132,5 @@
     is(scalar @$results, 4, "correct number of item returned");
 
-    isa_ok(@$results[0], 'DataStore::File::Record');
+    isa_ok(@$results[0], 'DataStore::File');
     is(@$results[0]->fileid, 'otis0123456.01', 'correct fileid');
     is(@$results[0]->bytes, '83002312', 'correct datetime');
@@ -138,5 +138,5 @@
     is(@$results[0]->type, 'chip', 'correct type');
 
-    isa_ok(@$results[1], 'DataStore::File::Record');
+    isa_ok(@$results[1], 'DataStore::File');
     is(@$results[1]->fileid, 'otis0123456.02', 'correct fileid');
     is(@$results[1]->bytes, '83002312', 'correct datetime');
@@ -144,5 +144,5 @@
     is(@$results[1]->type, 'chip', 'correct type');
 
-    isa_ok(@$results[2], 'DataStore::File::Record');
+    isa_ok(@$results[2], 'DataStore::File');
     is(@$results[2]->fileid, 'otis0123456.03', 'correct fileid');
     is(@$results[2]->bytes, '83002312', 'correct datetime');
@@ -150,5 +150,5 @@
     is(@$results[2]->type, 'chip', 'correct type');
 
-    isa_ok(@$results[3], 'DataStore::File::Record');
+    isa_ok(@$results[3], 'DataStore::File');
     is(@$results[3]->fileid, 'otis0123456.04', 'correct fileid');
     is(@$results[3]->bytes, '83002312', 'correct datetime');
@@ -175,5 +175,5 @@
     is(scalar @$results, 1, "correct number of item returned");
 
-    isa_ok(@$results[0], 'DataStore::File::Record');
+    isa_ok(@$results[0], 'DataStore::File');
     is(@$results[0]->fileid, 'otis0123456.01', 'correct fileid');
     is(@$results[0]->bytes, '83002312', 'correct datetime');
