File Coverage

blib/lib/Test/Stream/HashBase.pm
Criterion Covered Total %
statement 55 55 100.0
branch 10 12 83.3
condition 6 8 75.0
subroutine 14 14 100.0
pod 2 3 66.6
total 87 92 94.5


line stmt bran cond sub pod time code
1             package Test::Stream::HashBase;
2 109     109   1038 use strict;
  109         173  
  109         2664  
3 109     109   509 use warnings;
  109         174  
  109         2950  
4              
5 109     109   488 use Carp qw/confess croak/;
  109         189  
  109         5529  
6 109     109   524 use Scalar::Util qw/blessed reftype/;
  109         213  
  109         25662  
7              
8             $Carp::Internal{(__PACKAGE__)}++;
9              
10             my (%META);
11              
12             sub import {
13 4066     4066   13236 my ($class, %args) = @_;
14              
15 4066   66     17996 my $into = $args{into} || caller;
16 4066   100     14540 my $meta = $META{$into} = $args{accessors} || [];
17              
18             # Use the comment to change the filename slightly so that Devel::Cover does
19             # not try to cover the contents of the string eval.
20 4066         6347 my $file = __FILE__;
21 4066         82346 $file =~ s/(\.*)$/.eval$1/;
22 4066         11361 my $eval = "# line 1 \"$file\"\npackage $into;\n";
23              
24 4066 100       11787 if(my $base = $args{base}) {
25 2565   66     7704 my $bmeta = $META{$base} || croak "Base class '$base' is not a HashBase class";
26              
27 2563         18484 $eval .= "sub " . uc($_) . "() { '$_' };\n" for @$bmeta;
28              
29 109     109   570 no strict 'refs';
  109         242  
  109         18891  
30 2563 50       32247 push @{"$into\::ISA"} => $base
  2563         31145  
31             unless $into->isa($base);
32             }
33              
34             {
35 4064         8977 $eval .= join '' => map {
36 4064         8002 my $const = uc($_);
  14390         21116  
37             <<" EOT"
38             sub $const() { '$_' }
39             sub $_ { \$_[0]->{'$_'} }
40             sub set_$_ { \$_[0]->{'$_'} = \$_[1] }
41             sub clear_$_ { delete \$_[0]->{'$_'} }
42             EOT
43 14390         68270 } @$meta;
44             }
45              
46 4064 50       1625752 eval "${eval}1;" || die $@;
47              
48 4064 100       85308 return if $args{no_new};
49              
50 109     109   555 no strict 'refs';
  109         169  
  109         34972  
51 3969         7161 *{"$into\::new"} = \&_new;
  3969         1332328  
52             }
53              
54             sub _new {
55 16897     16897   54697 my ($class, %params) = @_;
56 16897         31909 my $self = bless \%params, $class;
57 16897 100       102937 $self->init if $self->can('init');
58 16860         57328 $self;
59             }
60              
61             sub gen_accessor {
62 50     50 1 617 my $class = shift;
63 50         90 my ($field) = @_;
64             sub {
65 168     168   470 my $self = shift;
66 168 100       486 ($self->{$field}) = @_ if @_;
67 168         754 $self->{$field};
68 50         251 };
69             }
70              
71             sub gen_getter {
72 7     7 1 16 my $class = shift;
73 7         13 my ($field) = @_;
74 7     9   48 sub { $_[0]->{$field} };
  9         38  
75             }
76              
77             sub gen_setter {
78 7     7 0 15 my $class = shift;
79 7         13 my ($field) = @_;
80 7     8   37 sub { $_[0]->{$field} = $_[1] };
  8         38  
81             }
82              
83             1;
84              
85             __END__