File Coverage

blib/lib/Tie/Hash/Transactional.pm
Criterion Covered Total %
statement 36 38 94.7
branch 4 4 100.0
condition n/a
subroutine 11 12 91.6
pod 3 3 100.0
total 54 57 94.7


line stmt bran cond sub pod time code
1             package Tie::Hash::Transactional;
2              
3 2     2   1195 use strict;
  2         3  
  2         980  
4              
5             my $VERSION='1.1';
6              
7             sub TIEHASH {
8 3     3   449 my $class = shift;
9 3         21 my %params = @_;
10 3         13 my $self = {
11             STACK => [],
12             CURRENT_STATE => {},
13             };
14            
15 3 100       43 warn(__PACKAGE__." is deprecated\n") unless($params{nowarn});
16              
17 3         22 return bless $self, $class;
18             }
19              
20             sub checkpoint {
21 2     2 1 134 my $self = shift;
22             # make a new copy of CURRENT_STATE before putting on stack,
23             # otherwise CURRENT_STATE and top-of-STACK will reference the
24             # same data structure, which would be a Bad Thing
25 2         3 my %hash_for_stack = %{$self->{CURRENT_STATE}};
  2         10  
26 2         3 push @{$self->{STACK}}, \%hash_for_stack;
  2         7  
27             }
28              
29             sub commit {
30 0     0 1 0 my $self = shift;
31 0         0 $self->{STACK}=[]; # clear all checkpoints
32             }
33              
34             sub rollback {
35 3     3 1 339 my $self = shift;
36 3 100       5 die("Attempt to rollback too far") unless(scalar @{$self->{STACK}});
  3         21  
37             # no copying required, just update a pointer
38 2         3 $self->{CURRENT_STATE}=pop @{$self->{STACK}};
  2         6  
39             }
40              
41             sub CLEAR {
42 2     2   12 my $self=shift;
43 2         17 $self->{CURRENT_STATE}={};
44             }
45              
46             sub STORE {
47 8     8   299 my($self, $key, $value)=@_;
48 8         33 $self->{CURRENT_STATE}->{$key}=$value;
49             }
50              
51             sub FETCH {
52 12     12   56 my($self, $key) = @_;
53 12         49 $self->{CURRENT_STATE}->{$key};
54             }
55              
56             sub FIRSTKEY {
57 4     4   23 my $self = shift;
58 4         5 scalar keys %{$self->{CURRENT_STATE}};
  4         8  
59 4         6 scalar each %{$self->{CURRENT_STATE}};
  4         15  
60             }
61              
62 12     12   14 sub NEXTKEY { my $self = shift; scalar each %{$self->{CURRENT_STATE}}; }
  12         14  
  12         45  
63 1     1   136 sub DELETE { my($self, $key) = @_; delete $self->{CURRENT_STATE}->{$key}; }
  1         4  
64 3     3   17 sub EXISTS { my($self, $key) = @_; exists($self->{CURRENT_STATE}->{$key}); }
  3         9  
65              
66             1;
67             __END__