1#
2# (c) Jan Gehring <jan.gehring@gmail.com>
3#
4# vim: set ts=2 sw=2 tw=0:
5# vim: set expandtab:
6
7package Rex::Shared::Var::Hash;
8
9use 5.010001;
10use strict;
11use warnings;
12
13use Rex::Shared::Var::Common qw/__lock __store __retrieve/;
14
15our $VERSION = '1.13.4'; # VERSION
16
17sub TIEHASH {
18  my $self = { varname => $_[1], };
19  bless $self, $_[0];
20}
21
22sub STORE {
23  my $self  = shift;
24  my $key   = shift;
25  my $value = shift;
26
27  return __lock sub {
28    my $ref = __retrieve;
29    my $ret = $ref->{ $self->{varname} }->{$key} = $value;
30    __store $ref;
31
32    return $ret;
33  };
34}
35
36sub FETCH {
37  my $self = shift;
38  my $key  = shift;
39
40  return __lock sub {
41    my $ref = __retrieve;
42    return $ref->{ $self->{varname} }->{$key};
43  };
44}
45
46sub DELETE {
47  my $self = shift;
48  my $key  = shift;
49
50  __lock sub {
51    my $ref = __retrieve;
52    delete $ref->{ $self->{varname} }->{$key};
53    __store $ref;
54  };
55}
56
57sub CLEAR {
58  my $self = shift;
59
60  __lock sub {
61    my $ref = __retrieve;
62    $ref->{ $self->{varname} } = {};
63    __store $ref;
64  };
65}
66
67sub EXISTS {
68  my $self = shift;
69  my $key  = shift;
70
71  return __lock sub {
72    my $ref = __retrieve;
73    return exists $ref->{ $self->{varname} }->{$key};
74  };
75}
76
77sub FIRSTKEY {
78  my $self = shift;
79
80  return __lock sub {
81    my $ref = __retrieve;
82    $self->{__iter__} = $ref->{ $self->{varname} };
83
84    my $temp = keys %{ $self->{__iter__} };
85    return scalar each %{ $self->{__iter__} };
86  };
87}
88
89sub NEXTKEY {
90  my $self    = shift;
91  my $prevkey = shift;
92
93  return scalar each %{ $self->{__iter__} };
94}
95
961;
97