{ package STATE; use strict; use warnings; use Storable qw( retrieve store ); use constant FILENAME => sprintf '%s.state', $0; sub import { no strict 'refs'; my $p = caller; *{"$p\::STATE"} = (${^STATE}{$p}||={}); } sub BEGIN { %{^STATE} = %{ -f FILENAME ? retrieve FILENAME : {} } } sub END { store \%{^STATE} => FILENAME; } } 1;