package MyObject; use Moose; use MooseX::WithCache; with 'MooseX::WithCache' => { backend => 'Cache::FileCache' }; has uuid => ( is => 'rw', default => 0 ); has arg1 => ( is => 'rw' ); has arg2 => ( is => 'rw' ); no Moose; sub get_object { my $self = shift; my %args = @_; my $obj; if ($args{uuid}) { $obj = $self->cache_get( $args{uuid} ); } unless (ref $obj) { my $uuid = 42; # use real UUID generator! $obj = MyObject->new( %args, uuid => $uuid ); $self->cache_set( $uuid => $obj ); } return $obj; } package main; use Data::Dumper; use Cache::FileCache; my $object = MyObject->new( cache => Cache::FileCache->new ); my $foo = $object->get_object( arg1 => 'foo', arg2 => 'bar' ); print Dumper $foo; my $bar = $object->get_object( uuid => 42 ); print Dumper $bar;