File Coverage

blib/lib/Pad/Tie/Plugin/List.pm
Criterion Covered Total %
statement 46 47 97.8
branch 4 4 100.0
condition 1 3 33.3
subroutine 14 15 93.3
pod 1 2 50.0
total 66 71 92.9


line stmt bran cond sub pod time code
1 1     1   1188 use strict;
  1         2  
  1         25  
2 1     1   3 use warnings;
  1         1  
  1         43  
3              
4             package Pad::Tie::Plugin::List;
5              
6 1     1   3 use base 'Pad::Tie::Plugin';
  1         1  
  1         323  
7              
8 1     1 1 1 sub provides { 'list' }
9              
10             sub list {
11 1     1 0 2 my ($plugin, $ctx, $self, $args) = @_;
12             # XXX seriously, refactor this
13 1   33     8 my $class = ref($plugin) || $plugin;
14              
15 1         4 $args = $plugin->canon_args($args);
16            
17             # XXX seriously, refactor this too
18 1         3 for my $method (keys %$args) {
19 1         1 tie @{ $ctx->{'@' . $args->{$method}} = [] }, $class, $self, $method;
  1         5  
20             }
21             }
22              
23             sub INV () { 0 }
24             sub METHOD () { 1 }
25             sub FETCH_CACHE () { 2 }
26             sub STORE_COUNT () { 3 }
27             sub STORE_CACHE () { 4 }
28              
29             # XXX this looks familiar too
30             sub TIEARRAY {
31 1     1   1 my ($class, $inv, $method) = @_;
32 1         6 bless [ $inv, $method ] => $class;
33             }
34              
35             BEGIN {
36 1     1   2 for my $unimp (qw(STORESIZE EXISTS DELETE PUSH POP SHIFT UNSHIFT
37             SPLICE)) {
38 1     1   5 no strict 'refs';
  1         1  
  1         51  
39 8     0   269 *$unimp = sub { Carp::croak "invalid operation for list method: $unimp" };
  0         0  
40             }
41             }
42              
43             sub __fetch {
44 5     5   6 my $self = shift;
45 5         4 my ($inv, $method) = @$self;
46 5         10 return @{ $self->[FETCH_CACHE] } = $inv->$method;
  5         36  
47             }
48            
49             sub FETCH {
50 3     3   18 $_[0]->__fetch;
51 3         9 return $_[0]->[FETCH_CACHE]->[$_[1]];
52             }
53              
54             sub FETCHSIZE {
55 2     2   20 my $self = shift;
56 2         6 $self->[STORE_COUNT] = undef;
57 2         4 return $self->__fetch;
58             }
59              
60             sub STORE {
61 3     3   4 my $self = shift;
62 3 100       156 Carp::croak "do not assign to individual list elements"
63             unless defined $self->[STORE_COUNT];
64 2         2 push @{ $self->[STORE_CACHE] }, $_[1];
  2         5  
65 2 100       12 if (--$self->[STORE_COUNT] < 1) {
66 1         3 my ($inv, $method) = @$self;
67             #warn "calling $inv->$method with @{ $self->[STORE_CACHE] }\n";
68 1         2 $inv->$method(@{ $self->[STORE_CACHE] });
  1         7  
69 1         14 $self->[STORE_CACHE] = [];
70 1         5 $self->[STORE_COUNT] = undef;
71             }
72             }
73              
74             sub CLEAR {
75 1     1   448 undef $_[0]->[$_] for FETCH_CACHE, STORE_COUNT, STORE_CACHE;
76             }
77              
78             sub EXTEND {
79 1     1   2 $_[0]->[FETCH_CACHE] = undef;
80 1         2 $_[0]->[STORE_COUNT] = $_[1];
81 1         5 $_[0]->[STORE_CACHE] = [];
82             }
83              
84             1;