File Coverage

blib/lib/Data/Iterator/EasyObj.pm
Criterion Covered Total %
statement 59 68 86.7
branch 12 20 60.0
condition 3 9 33.3
subroutine 12 13 92.3
pod 3 7 42.8
total 89 117 76.0


line stmt bran cond sub pod time code
1             package Data::Iterator::EasyObj;
2              
3 1     1   7261 use strict;
  1         2  
  1         38  
4 1     1   5 use vars qw/$AUTOLOAD $VERSION/;
  1         2  
  1         58  
5             $VERSION = 0.01;
6 1     1   1212 use Data::Dumper;
  1         10211  
  1         538  
7              
8             sub new {
9 2     2 1 35 my ($class,$data,$fields,%args) = @_;
10 2         3 my $fieldshash;
11             # warn "fields : \n", Dumper($fields), "\n";
12 2 50       10 if (lc(ref $fields) eq "hash") {
    50          
13 0         0 foreach my $key (keys %$fields) {
14 0 0       0 if (ref($fields->{$key})) {
15 0         0 $fieldshash->{$key} = $fields->{$key};
16 0         0 warn "using id\n";
17             } else {
18 0         0 $fieldshash->{$key} = { id => $fields->{$key} };
19 0         0 warn "creating id\n";
20             }
21             }
22             } elsif (lc(ref $fields) eq "array") {
23 2         2 my $i = 0;
24 2         4 foreach my $field (@$fields) {
25 6         16 $fieldshash->{$field} = { id => $i++} ;
26             }
27             } else {
28 0         0 die "fields must be an arrayref or hashref\n";
29             }
30             # warn "fieldshash : \n", Dumper($fieldshash), "\n";
31 2         3 my $self = [ $data, $fieldshash, -1, scalar @{$data}, {}, 0];
  2         6  
32 2   33     12 bless ($self,ref($class) || $class);
33 2   33     15 $args{limit} ||= $self->[3];
34 2 50       6 $self->offset($args{offset}) if ($args{offset});
35 2 50       22 $self->limit($args{limit}) if ($args{limit});
36 2         4 return $self;
37             }
38              
39             sub next {
40             # warn "getting next record\n";
41 17     17 0 40 my $self = shift;
42 17 100       35 $self->[2]+= $self->[5] if ($self->[2] < 0 );
43 17         18 $self->[2]++;
44 17         18 my $return = 1;
45 17 100       43 if ($self->[2] >= $self->[3]) {
    100          
46 4         4 $return = 0;
47 4         7 $self->[2] = -1;
48             } elsif ($self->[2] >= $self->[6]) {
49 1         2 $return = 0;
50 1         1 $self->[2] = -1;
51             }
52 17         26 $self->[4] = $self->[0][$self->[2]];
53             # warn "current record ::\n", Dumper(@{$self->[4]});
54 17         27 return $return;
55             }
56              
57             sub offset {
58 1     1 1 6 my ($self,$offset) = @_;
59 1         2 $self->[5] = $offset;
60 1 50 33     17 $self->[2] = $offset if ($self->[2] >= 0 && $self->[2] < $offset);
61 1         2 my $return = 1;
62 1         3 return $return;
63             }
64              
65             sub limit {
66 3     3 1 7 my ($self,$limit) = @_;
67 3         5 my $return = 1;
68 3         7 $self->[6] = $limit + $self->[5];
69 3         5 return $return;
70             }
71              
72              
73             sub count {
74 0     0 0 0 my $self = shift;
75 0         0 return $self->[3];
76             }
77              
78             sub add_column {
79 4     4 0 16 my ($self, $name) = @_;
80 4         3 my $fieldcount = keys %{$self->[1]};
  4         8  
81             # warn "adding column : fieldcount is $fieldcount\n";
82 4         19 $self->[1]{$name}{id}=$fieldcount;
83             }
84              
85             sub add_value {
86 4     4 0 14 my ($self, $field,$value) = @_;
87             # warn"adding value : $field / $value";
88 4         13 $self->[4][$self->[1]{$field}{id}] = $value;
89             }
90              
91             ########################################################################################
92              
93             sub AUTOLOAD {
94 1     1   8 no strict "refs";
  1         2  
  1         169  
95 7     7   53 my ($self) = @_;
96 7         21 $AUTOLOAD =~ /.*::(\w+)/;
97 7         14 my $field = $1;
98             # warn "(autoload) getting $field \n";
99 7 50       16 exists $self->[1]{$field} or die "no such field : $field \n";
100 7         19 *{$AUTOLOAD} = sub {
101             # warn "(magic) getting $field -- counter : $self->[2] -- field : ", Dumper(%{$self->[1]{$field}})," -- value : $self->[4][$self->[1]{$field}{id}]\n";
102 53     53   345 return $self->[4][$self->[1]{$field}{id}]
103 7         37 };
104 7         92 return $self->[4][$self->[1]{$field}{id}];
105             }
106              
107             ########################################################################################
108             ########################################################################################
109              
110             1;
111              
112             ###########################################################################
113              
114             __END__