package File::Assets::Asset::Content;
use warnings;
use strict;
use Object::Tiny qw/file/;
use File::Assets::Carp;
use File::Assets::Util;
sub new {
my $self = bless {}, shift;
$self->{file} = shift or croak "Can't have content without a file";
return $self;
}
sub content {
my $self = shift;
my $file = $self->file;
croak "Trying to get content from non-existent file ($file)" unless -e $file;
if (! $self->{content} || $self->stale) {
local $/ = undef;
$self->{content} = \$file->slurp;
$self->{content_mtime} = $file->stat->mtime;
$self->{content_size} = length ${ $self->{content} };
}
return $self->{content};
}
sub digest {
my $self = shift;
return $self->{digest} ||= do {
File::Assets::Util->digest->add(${ $self->content })->hexdigest;
}
}
sub file_mtime {
my $self = shift;
return (stat($self->file))[9] || 0;
}
sub file_size {
my $self = shift;
return (stat($self->file))[7] || 0;
}
sub content_mtime {
my $self = shift;
$self->content unless $self->{content};
return $self->{content_mtime};
}
sub content_size {
my $self = shift;
$self->content unless $self->{content};
return $self->{content_size};
}
sub refresh {
my $self = shift;
if ($self->stale) {
delete $self->{digest};
delete $self->{content};
return 1;
}
return 0;
}
sub stale {
my $self = shift;
return
($self->file_mtime > $self->content_mtime) ||
($self->file_size != $self->content_size);
}
1;