Index: /trunk/DataStore/Build.PL
===================================================================
--- /trunk/DataStore/Build.PL	(revision 6587)
+++ /trunk/DataStore/Build.PL	(revision 6588)
@@ -12,4 +12,5 @@
         'Data::Validate::URI'   => '0.01',
         'LWP::UserAgent'        => 0,
+        'POSIX'                 => 0,
         'Params::Validate'      => '0.77',
         'Regexp::Common'        => '2.113',
Index: /trunk/DataStore/lib/DataStore/File.pm
===================================================================
--- /trunk/DataStore/lib/DataStore/File.pm	(revision 6587)
+++ /trunk/DataStore/lib/DataStore/File.pm	(revision 6588)
@@ -1,5 +1,5 @@
 # Copyright (C) 2006  Joshua Hoblitt
 #
-# $Id: File.pm,v 1.2 2006-03-08 02:12:17 jhoblitt Exp $
+# $Id: File.pm,v 1.3 2006-03-15 03:30:51 jhoblitt Exp $
 
 package DataStore::File;
@@ -13,4 +13,7 @@
 use base qw( DataStore::Record );
 
+use Carp qw( carp );
+use Digest::MD5::File qw( file_md5_hex );
+use POSIX;
 use Params::Validate qw( validate SCALAR );
 
@@ -83,4 +86,67 @@
 }
 
+=back
+
+=head3 Object Methods
+
+=over 4
+
+=item * C<request()>
+
+=cut
+
+sub request 
+{
+    my $self = shift;
+
+    my %p = validate(@_,
+        {
+            filename    => {
+                type        => SCALAR,
+                regex       => qr/\S+/, # string with atleast 1 non WS char
+                callbacks   => {
+                    'write access' => sub {
+                        POSIX::access($_[0], &POSIX::W_OK);
+                    },
+                },
+            },
+        },
+    );
+
+    # make request
+    my $ua = LWP::UserAgent->new;
+    my $request = HTTP::Request->new(GET => $self->uri);
+    my $response = $ua->request($request, $p{filename});
+
+    if (! $response->is_success) {
+        carp $response->status_line;
+        return;
+    }
+
+    if (defined $self->bytes) {
+        my $size = stat($p{filename})->size;
+        if (! $self->bytes == $size) {
+            unlink $p{filename};
+            carp "uri: ", $self->uri,
+                 " - expected size: ", $self->bytes,
+                 " got: ", $size;
+            return;
+        }
+    }
+
+    if (defined $self->md5sum) {
+        my $md5 = file_md5_hex($p{filename});
+        if (! $self->md5sum eq $md5) {
+            unlink $p{filename};
+            carp "uri: ", $self->uri,
+                 " - expected md5: ", $self->md5sum,
+                 " got: ", $md5;
+            return;
+        }
+    }
+
+    return 1;
+}
+
 1;
 
