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   4704 use strict;
  2         4  
  2         2170  
4              
5             my $VERSION='1.1';
6              
7             sub TIEHASH {
8 3     3   97 my $class = shift;
9 3         20 my %params = @_;
10 3         10 my $self = {
11             STACK => [],
12             CURRENT_STATE => {},
13             };
14            
15 3 100       15 warn(__PACKAGE__." is deprecated\n") unless($params{nowarn});
16              
17 3         21 return bless $self, $class;
18             }
19              
20             sub checkpoint {
21 2     2 1 14 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         1 my %hash_for_stack = %{$self->{CURRENT_STATE}};
  2         8  
26 2         3 push @{$self->{STACK}}, \%hash_for_stack;
  2         5  
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 25 my $self = shift;
36 3 100       4 die("Attempt to rollback too far") unless(scalar @{$self->{STACK}});
  3         18  
37             # no copying required, just update a pointer
38 2         3 $self->{CURRENT_STATE}=pop @{$self->{STACK}};
  2         5  
39             }
40              
41             sub CLEAR {
42 2     2   11 my $self=shift;
43 2         14 $self->{CURRENT_STATE}={};
44             }
45              
46             sub STORE {
47 8     8   28 my($self, $key, $value)=@_;
48 8         31 $self->{CURRENT_STATE}->{$key}=$value;
49             }
50              
51             sub FETCH {
52 12     12   40 my($self, $key) = @_;
53 12         54 $self->{CURRENT_STATE}->{$key};
54             }
55              
56             sub FIRSTKEY {
57 4     4   20 my $self = shift;
58 4         4 scalar keys %{$self->{CURRENT_STATE}};
  4         6  
59 4         4 scalar each %{$self->{CURRENT_STATE}};
  4         13  
60             }
61              
62 12     12   11 sub NEXTKEY { my $self = shift; scalar each %{$self->{CURRENT_STATE}}; }
  12         11  
  12         33  
63 1     1   14 sub DELETE { my($self, $key) = @_; delete $self->{CURRENT_STATE}->{$key}; }
  1         5  
64 3     3   17 sub EXISTS { my($self, $key) = @_; exists($self->{CURRENT_STATE}->{$key}); }
  3         9  
65              
66             1;
67             __END__