The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
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;