File Coverage

blib/lib/HTML/TableContent/Template.pm
Criterion Covered Total %
statement 137 139 98.5
branch 12 14 85.7
condition 2 3 66.6
subroutine 44 45 97.7
pod n/a
total 195 201 97.0


line stmt bran cond sub pod time code
1             package HTML::TableContent::Template;
2              
3 3     3   62999 use strict;
  3         8  
  3         48  
4 3     3   12 use warnings;
  3         8  
  3         43  
5 3     3   12 use Carp qw/croak/;
  3         8  
  3         70  
6 3     3   626 use MooX::ReturnModifiers;
  3         885  
  3         81  
7 2     3   677 use HTML::TableContent::Table;
  2         6  
  2         52  
8 2     3   13 use HTML::TableContent::Table::Caption;
  2         3  
  2         33  
9 2     2   9 use HTML::TableContent::Table::Header;
  2         4  
  2         153  
10              
11             our $VERSION = '0.18';
12              
13             my %TABLE = (
14             caption => 'HTML::TableContent::Table::Caption',
15             header => 'HTML::TableContent::Table::Header',
16             row => 'HTML::TableContent::Table::Row',
17             cell => 'HTML::TableContent::Table::Row::Cell',
18             );
19              
20             sub import {
21 45     45   46584 my ( $self, @import ) = @_;
22            
23 45         131 my $target = caller;
24            
25 45         166 my %modifiers = return_modifiers($target);
26              
27 45         1857 my @target_isa;
28              
29 45 50       279 return if $target->can('_table');
30              
31 2     2   10 { no strict 'refs'; @target_isa = @{"${target}::ISA"} };
  2         4  
  2         759  
  45         87  
  45         72  
  45         186  
32              
33 45 50       128 if (@target_isa) {
34 45     2   6976 eval '{
  2     2   8  
  2     2   7  
  2     2   7  
  2     2   7  
  2     2   7  
  2     3   8  
  2     2   6  
  2     2   8  
  2     2   8  
  2     2   8  
  2     1   6  
  2     2   9  
  3     2   11  
  3     2   12  
  2     2   8  
  2     2   9  
  2     2   7  
  2     2   8  
  2     2   9  
  2     2   7  
  2     2   9  
  2     3   7  
  1     2   4  
  1     2   4  
  2     2   8  
  2     2   9  
  2         8  
  2         8  
  2         8  
  2         9  
  2         9  
  2         8  
  2         12  
  2         10  
  2         6  
  2         8  
  2         7  
  2         8  
  2         9  
  2         11  
  2         8  
  2         8  
  2         7  
  2         8  
  3         12  
  3         11  
  2         8  
  2         9  
  2         7  
  2         8  
  2         8  
  2         9  
  2         7  
  2         7  
35             package ' . $target . ';
36              
37             sub _caption_spec {
38             my ($class, @meta) = @_;
39             return $class->maybe::next::method(@meta);
40             }
41              
42             sub _header_spec {
43             my ($class, @meta) = @_;
44             return $class->maybe::next::method(@meta);
45             }
46            
47             sub _row_spec {
48             my ($class, @meta) = @_;
49             return $class->maybe::next::method(@meta);
50             }
51            
52             sub _cell_spec {
53             my ($class, @meta) = @_;
54             return $class->maybe::next::method(@meta);
55             }
56            
57             1;
58             }';
59             }
60              
61 45     1   303 $modifiers{has}->( 'package' => ( is => 'ro', lazy => 1, default => sub { return $target; } ) );
  0         0  
62              
63             my $apply_modifiers = sub {
64 45     46   141 $modifiers{with}->('HTML::TableContent::Template::Base');
65 45         48237 };
66              
67 45         165 for my $element (keys %TABLE) {
68 180         341 my @element = ();
69             my $option = sub {
70 217     218   1394 my ( $name, %attributes ) = @_;
71            
72 217         454 my $element_data = { };
73 217         743 my %filtered_attributes = _filter_attributes($name, $element, %attributes);
74              
75 217 100       1152 if ( $element =~ m{caption|header}ixms ){
76 180         763 $modifiers{has}->( $name => %filtered_attributes );
77             }
78              
79 217         129094 delete $filtered_attributes{default};
80              
81 217         523 $element_data->{$name} = \%filtered_attributes;
82            
83 217         805 my $spec = sprintf('_%s_spec', $element);
84 217 100       1014 if ( $element =~ m{row|cell}ixms ) {
85             $modifiers{around}->(
86             $spec => sub {
87 36     37   573 my ( $orig, $self ) = ( shift, shift );
88 36         600 return $self->$orig(@_), %$element_data;
89             }
90 37         198 );
91             } else {
92 180         386 push @element, $element_data;
93             $modifiers{around}->(
94             $spec => sub {
95 180     181   2602 my ( $orig, $self ) = ( shift, shift );
96 180         3384 return $self->$orig(@_), \@element;
97             }
98 180         969 );
99             }
100 217         49332 return;
101 180         598 };
102              
103 2     2   12 { no strict 'refs'; *{"${target}::$element"} = $option; }
  2         4  
  2         497  
  180         302  
  180         271  
  180         761  
104             }
105              
106 45         130 $apply_modifiers->();
107              
108 45         52464 return;
109             }
110              
111             sub _filter_attributes {
112 218     218   609 my ($name, $element, %attributes) = @_;
113              
114 218         483 $attributes{template_attr} = $name;
115              
116 218 100       633 if ( ! exists $attributes{text} ) {
117 161         312 $attributes{text} = $name;
118             }
119              
120 218 100 66     625 if ( $element eq 'cell' && exists $attributes{alternate_classes} ) {
121 4         10 my @classes = @{ $attributes{alternate_classes} };
  4         13  
122 4         11 $attributes{oac} = \@classes;
123             }
124              
125 218         744 my %tattr = %attributes;
126 218         492 $attributes{is} = 'ro';
127 218         402 $attributes{lazy} = 1;
128 218 100       999 if ( $element =~ m{row|cell}ixms ) {
129 37     0   144 $attributes{default} = sub { return \%tattr; };
  0         0  
130             } else {
131 180         361 my $class = $TABLE{$element};
132 180     180   775 $attributes{default} = sub { my %aah = %tattr; return $class->new(\%aah); };
  180         2251  
  180         2831  
133             }
134              
135 217         1268 return %attributes;
136             }
137              
138             1;
139              
140             __END__