Script-State

 view release on metacpan or  search on metacpan

lib/Script/State.pm  view on Meta::CPAN

package Script::State;
use strict;
use warnings;
use PadWalker qw(var_name);
use Data::Dumper;

our $VERSION = '0.03';

our $DATAFILE;
our $SCRIPT_DATA;
our $VAR_REF;

sub script_state {
    my $name = var_name 1, \$_[0] or do {
        require Carp;
        Carp::croak('Invalid variable passed');
    };
    $VAR_REF->{$name} = \$_[0];

    if (exists $SCRIPT_DATA->{$name}) {
        $_[0] = $SCRIPT_DATA->{$name};
    } elsif ($#_ >= 1) {
        $_[0] = $_[1];
    }
}

sub store {
    if ($DATAFILE && $VAR_REF) {
        open my $fh, '>', $DATAFILE or do {
            warn "Could not open $DATAFILE: $!";
            return;
        };

        my $vars = { map { $_ => ${ $VAR_REF->{$_} } } keys %$VAR_REF };
        print $fh Data::Dumper->new([ $vars ])->Varname('VAR')->Terse(0)->Indent(1)->Purity(1)->Dump;
        close $fh;

        return 1;
    }
}

sub import {
    my ($class, %args) = @_;

    $DATAFILE = delete $args{-datafile} || do {
        require File::Spec;
        my ($vol, $dirs, $file) = File::Spec->splitpath($0);
        File::Spec->catpath($vol, $dirs, ".$file.pl");
    };

    $SCRIPT_DATA = -r $DATAFILE ? do { do $DATAFILE; no strict 'vars'; $VAR1 } : {}; ## no critic

    my $pkg = caller;
    no strict 'refs';
    *{ "$pkg\::script_state" } = \&script_state;
}

END {
    __PACKAGE__->store;
}

1;

__END__



( run in 1.204 second using v1.01-cache-2.11-cpan-39bf76dae61 )