package Common::DiskCache;
use strict;
use warnings;
use Data::Dumper;

use constant kBasePath => '/tmp';

sub Store {
    my ( $obj, @keys ) = @_;

    my $path = _keysToPath(@keys);

    open( STORE, "> $path" ) or die "Unable to open $path for writing : $!\n";

    # This forces Dumper to output code to fill-in references - Otherwise,
    # objects won't re-eval properly.
    #
    $Data::Dumper::Purity = 1;

    print STORE Dumper($obj);
    close(STORE);

    return 1;
}

sub Fetch {
    my (@keys) = @_;

    my $path = _keysToPath(@keys);

    return 0 unless open( RESTORE, "< $path" );

    my $objState;
    while ( my $line = <RESTORE> ) {
        $objState .= $line;
    }

    # Attempt to re-instantiate cached object.
    #
    my $VAR1;
    eval($objState);
    die $@ if $@;

    return $VAR1;
}

# Need to support deep paths !!!!

sub _keysToPath {
    my (@keys) = @_;

    my $path = kBasePath;

    $path .= '/';
    foreach my $k (@keys) {
        $path .= '_' . $k;
    }
    $path .= '.cache';

    return $path;
}

1;
