File Coverage

blib/lib/OPP/State.pm
Criterion Covered Total %
statement 9 48 18.7
branch 0 2 0.0
condition 0 2 0.0
subroutine 3 15 20.0
pod 0 11 0.0
total 12 78 15.3


line stmt bran cond sub pod time code
1             #
2             # $Id: State.pm,v cfbea05b0bc4 2025/01/28 15:06:19 gomor $
3             #
4             package OPP::State;
5 1     1   941 use strict;
  1         2  
  1         86  
6 1     1   7 use warnings;
  1         2  
  1         96  
7              
8             our $VERSION = '1.00';
9              
10 1     1   7 use base qw(OPP);
  1         1  
  1         1001  
11              
12             our @AS = qw(
13             state
14             );
15             __PACKAGE__->cgBuildIndices;
16             __PACKAGE__->cgBuildAccessorsScalar(\@AS);
17              
18             sub init {
19 0     0 0   my $self = shift;
20              
21 0           $self->state({});
22              
23 0           return $self;
24             }
25              
26             sub _proc {
27 0     0     my $self = shift;
28 0           my ($idx) = @_;
29              
30             # We have to have a set per each proc so we can call multiple times
31             # same procs (multiple | uniq, for instance). Otherwise, there will
32             # be a collision and only first call we have its state kept and later
33             # results will be lost:
34              
35 0   0       $idx ||= 0;
36              
37 0           my @c = caller(1);
38              
39 0           my $module = $c[0];
40 0           $module =~ s{^.*::(\S+)$}{$1};
41              
42 0           return lc($module).':'.$idx;
43             }
44              
45             # Return proc state object:
46             sub current {
47 0     0 0   my $self = shift;
48 0           my ($idx) = @_;
49              
50 0           return $self->state->{$self->_proc($idx)};
51             }
52              
53             # Update proc state object from another state object:
54             sub update {
55 0     0 0   my $self = shift;
56 0           my ($state, $idx) = @_;
57              
58 0           return $self->state->{$self->_proc($idx)} = $state;
59             }
60              
61             # Reset proc state object:
62             sub reset {
63 0     0 0   my $self = shift;
64 0           my ($idx) = @_;
65              
66 0           return $self->state->{$self->_proc($idx)} = undef;
67             }
68              
69             # Reset all state objects:
70             sub reset_all {
71 0     0 0   my $self = shift;
72              
73 0           return $self->state = {};
74             }
75              
76             sub add {
77 0     0 0   my $self = shift;
78 0           my ($k, $v, $idx) = @_;
79              
80 0           return $self->state->{$self->_proc($idx)}{$k} = $v;
81             }
82              
83             sub del {
84 0     0 0   my $self = shift;
85 0           my ($k, $idx) = @_;
86              
87 0           return delete $self->state->{$self->_proc($idx)}{$k};
88             }
89              
90             sub exists {
91 0     0 0   my $self = shift;
92 0           my ($k, $idx) = @_;
93              
94 0 0         return defined($self->state->{$self->_proc($idx)}{$k}) ? 1 : 0;
95             }
96              
97             sub incr {
98 0     0 0   my $self = shift;
99 0           my ($k, $idx) = @_;
100              
101 0           return $self->state->{$self->_proc($idx)}{$k}++;
102             }
103              
104             sub decr {
105 0     0 0   my $self = shift;
106 0           my ($k, $idx) = @_;
107              
108 0           return $self->state->{$self->_proc($idx)}{$k}--;
109             }
110              
111             sub value {
112 0     0 0   my $self = shift;
113 0           my ($k, $idx) = @_;
114              
115 0           return $self->state->{$self->_proc($idx)}{$k};
116             }
117              
118             1;
119              
120             __END__