The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Autocache::Record;

use strict;
use warnings;

use Autocache::Logger qw(get_logger);

our $AUTOLOAD;

sub new
{
    my ($class,%args) = @_;
    my $now = time;
    $args{name} = 'unknown'
        unless defined $args{name};
    $args{create_time} = $now
        unless defined $args{create_time};
    my $self = { %args };
    return bless $self, $class;
}

sub name
{
    $_[0]->{name};
}

sub create_time
{
    $_[0]->{create_time};
}

sub age
{
    time - $_[0]->create_time;
}

sub to_string
{
    my ($self) = @_;
    return sprintf 'name: %s - key: %s - create_time: %d - age: %d',
        $self->name,
        $self->key,
        $self->create_time,
        $self->age;
}

sub AUTOLOAD
{
    my ($self) = @_;
    return if $AUTOLOAD =~ /::DESTROY$/;
    get_logger()->debug( "AUTOLOAD $AUTOLOAD" );
    if( $AUTOLOAD =~ m/^.*::(\w+?)$/ )
    {
        my $name = $1;
        {
            no strict 'refs';
            *{$AUTOLOAD} = sub
            {
                if( scalar @_ > 1 )
                {
                    $_[0]->{$name} = $_[1];
                }
                else
                {
                    return $_[0]->{$name};
                }
            };
        }
        goto &{$AUTOLOAD};
    }
    get_logger()->error( "AUTOLOAD failed : $AUTOLOAD" );
}

1;