File Coverage

blib/lib/Redis/Key.pm
Criterion Covered Total %
statement 15 74 20.2
branch 0 20 0.0
condition 0 8 0.0
subroutine 5 17 29.4
pod 0 6 0.0
total 20 125 16.0


line stmt bran cond sub pod time code
1             package Redis::Key;
2              
3 3     3   608097 use strict;
  3         9  
  3         130  
4 3     3   16 use warnings;
  3         8  
  3         80  
5 3     3   15 use Carp;
  3         10  
  3         346  
6             our $VERSION = '0.03';
7              
8 3     3   1267 use Redis;
  3         133993  
  3         2886  
9              
10             # key: you should not pass any args
11             # pass: do not change args
12             # invalid: the command cannot use with Redis::Key
13             our %command_type = (
14             del => 'key',
15              
16             auth => 'pass',
17             bgrewriteaof => 'pass',
18             bgsave => 'pass',
19             config => 'pass',
20             dbsize => 'pass',
21             discard => 'pass',
22             exec => 'pass',
23             info => 'pass',
24             lastsave => 'pass',
25             ping => 'pass',
26             save => 'pass',
27             multi => 'pass',
28             wait_all_responses => 'pass',
29             wait_one_responses => 'pass',
30              
31             flushall => 'invalid',
32             flushdb => 'invalid',
33             quit => 'invalid',
34             select => 'invalid',
35             shutdown => 'invalid',
36             slaveof => 'invalid',
37             );
38              
39             our %wrappers = (
40             );
41              
42             sub new {
43 0     0 0   my $class = shift;
44 0           my %args = @_;
45 0           my $self = bless {}, $class;
46              
47 0   0       $self->{redis} = $args{redis} || Redis->new(%args);
48 0           $self->{key} = $args{key};
49 0           $self->{need_bind} = $args{need_bind};
50 0           return $self;
51             }
52              
53 0     0 0   sub redis { shift->{redis} }
54 0     0 0   sub key { shift->{key} }
55              
56             sub keys {
57 0     0 0   my $self = shift;
58 0           my $key = $self->{key};
59 0 0         if($self->{need_bind}) {
60 0           $key =~ s!{\w+}!*!g;
61 0           my $redis = $self->{redis};
62 0           return $redis->keys($key);
63             } else {
64 0 0         return wantarray ? ($key) : 1;
65             }
66             }
67              
68             sub scan {
69 0     0 0   my ($self, $iter, @args) = @_;
70 0           my $key = $self->{key};
71 0 0         if($self->{need_bind}) {
72 0           $key =~ s!{\w+}!*!g;
73 0           my $redis = $self->{redis};
74 0           return $redis->scan($iter, @args, MATCH => $key);
75             } else {
76 0           return (0, [$key]);
77             }
78             }
79              
80             sub bind {
81 0     0 0   my $self = shift;
82 0           my $key = $self->{key};
83 0           my %hash = @_;
84              
85 0           $key =~ s!{(\w+)}!
86 0   0       $hash{$1} // croak("$1 is not passed to $key");
87             !eg;
88              
89 0           return __PACKAGE__->new(
90             redis => $self->{redis},
91             key => $key,
92             need_bind => 0,
93             );
94             }
95              
96 0     0     sub DESTROY { }
97              
98             our $AUTOLOAD;
99             sub AUTOLOAD {
100 0     0     my $command = $AUTOLOAD;
101 0           $command =~ s/.*://;
102              
103 0   0       my $type = $command_type{$command} || 'normal';
104 0           my $method;
105              
106 0 0         if($type eq 'normal') {
    0          
    0          
    0          
107             $method = sub {
108 0     0     my $self = shift;
109 0           my $redis = $self->{redis};
110 0           my $key = $self->{key};
111              
112 0 0         if($self->{need_bind}) {
113 0           croak "$key needs bind";
114             }
115              
116 0           $redis->$command($key, @_);
117 0           };
118             } elsif($type eq 'key') {
119             $method = sub {
120 0     0     my $self = shift;
121 0           my $redis = $self->{redis};
122 0           my $key = $self->{key};
123              
124 0 0         if($self->{need_bind}) {
125 0           croak "$key needs bind";
126             }
127 0 0         if(@_) {
128 0           croak "too many args for $command";
129             }
130              
131 0           $redis->$command($key);
132 0           };
133             } elsif($type eq 'pass') {
134             $method = sub {
135 0     0     my $self = shift;
136 0           my $redis = $self->{redis};
137 0           $redis->$command(@_);
138 0           };
139             } elsif($type eq 'invalid') {
140             $method = sub {
141 0     0     croak "$command connot use with Redis::Key";
142 0           };
143             }
144              
145             # Save this method for future calls
146 3     3   28 no strict 'refs';
  3         5  
  3         233  
147 0           *$AUTOLOAD = $method;
148              
149 0           goto $method;
150             }
151              
152             1;
153             __END__