Package-Checkpoint
view release on metacpan or search on metacpan
lib/Package/Checkpoint.pm view on Meta::CPAN
package Package::Checkpoint;
use strict;
use warnings;
use 5.020;
use experimental qw( postderef signatures );
use Package::Stash;
use Storable qw( dclone );
use Ref::Util qw( is_ref );
# ABSTRACT: Checkpoint the scalar, array and hash values in a package for later restoration
our $VERSION = '0.01'; # VERSION
sub new ($class, $name)
{
my %self = ( name => $name );
my $stash = $self{stash} = Package::Stash->new($name);
foreach my $var ($stash->list_all_symbols('SCALAR'))
{
my $value = $stash->get_symbol("\$$var")->$*;
$self{scalar}->{$var} = is_ref($value) ? dclone($value) : $value;
}
foreach my $var ($stash->list_all_symbols('ARRAY'))
{
$self{array}->{$var} = dclone $stash->get_symbol("\@$var");
}
foreach my $var ($stash->list_all_symbols('HASH'))
{
$self{hash}->{$var} = dclone $stash->get_symbol("\%$var");
}
bless \%self, $class;
}
sub restore ($self)
{
my $stash = $self->{stash};
foreach my $var (keys $self->{scalar}->%*)
{
my $value = $self->{scalar}->{$var};
$stash->get_symbol("\$$var")->$* = is_ref $value ? dclone($value) : $value;
}
foreach my $var (keys $self->{array}->%*)
{
$stash->get_symbol("\@$var")->@* = dclone($self->{array}->{$var})->@*;
}
foreach my $var (keys $self->{hash}->%*)
{
$stash->get_symbol("\%$var")->%* = dclone($self->{hash}->{$var})->%*;
}
return $self;
}
1;
__END__
=pod
( run in 2.418 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )