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 )