File Coverage

blib/lib/Khonsu/Ra.pm
Criterion Covered Total %
statement 230 244 94.2
branch 17 24 70.8
condition 5 6 83.3
subroutine 62 66 93.9
pod 0 6 0.0
total 314 346 90.7


line stmt bran cond sub pod time code
1             package Khonsu::Ra;
2              
3 5     5   2144 use strict;
  5         18  
  5         151  
4 5     5   42 use warnings;
  5         10  
  5         126  
5              
6 5     5   2118 use Clone;
  5         12408  
  5         236  
7              
8 5     5   1989 use Khonsu::Shape::Line;
  5         16  
  5         165  
9 5     5   2023 use Khonsu::Shape::Box;
  5         26  
  5         162  
10 5     5   1892 use Khonsu::Shape::Circle;
  5         13  
  5         173  
11 5     5   1852 use Khonsu::Shape::Pie;
  5         13  
  5         176  
12 5     5   1896 use Khonsu::Shape::Ellipse;
  5         17  
  5         207  
13              
14 5     5   1932 use Khonsu::Font;
  5         14  
  5         164  
15              
16 5     5   1892 use Khonsu::Text;
  5         13  
  5         188  
17 5     5   1965 use Khonsu::Text::H1;
  5         11  
  5         191  
18 5     5   1975 use Khonsu::Text::H2;
  5         20  
  5         187  
19 5     5   1922 use Khonsu::Text::H3;
  5         14  
  5         192  
20 5     5   1985 use Khonsu::Text::H4;
  5         13  
  5         194  
21 5     5   1849 use Khonsu::Text::H5;
  5         13  
  5         232  
22 5     5   1903 use Khonsu::Text::H6;
  5         13  
  5         248  
23              
24 5     5   1911 use Khonsu::Image;
  5         24  
  5         206  
25              
26 5     5   1985 use Khonsu::Form;
  5         13  
  5         265  
27 5     5   2061 use Khonsu::Form::Field::Input;
  5         12  
  5         263  
28 5     5   2060 use Khonsu::Form::Field::Select;
  5         14  
  5         256  
29 5     5   1998 use Khonsu::Form::Field::Checkbox;
  5         12  
  5         253  
30              
31 5     5   1985 use Khonsu::TOC;
  5         13  
  5         280  
32              
33 5     5   2994 use Types::Standard qw/Str Object ArrayRef HashRef Num Bool CodeRef/;
  5         371842  
  5         45  
34              
35 5     5   7956 use constant RW => (is => 'rw');
  5         11  
  5         459  
36 5     5   35 use constant REQ => (required => 1);
  5         9  
  5         342  
37 5     5   32 use constant STR => (isa => Str);
  5         13  
  5         22  
38 5     5   335 use constant OBJ => (isa => Object);
  5         10  
  5         35  
39 5     5   328 use constant BOOL => (isa => Bool);
  5         11  
  5         26  
40 5     5   320 use constant AR => (isa => ArrayRef);
  5         51  
  5         18  
41 5     5   353 use constant HR => (isa => HashRef);
  5         12  
  5         17  
42 5     5   428 use constant DAR => (isa => ArrayRef, default => sub { [ ] });
  5         51  
  5         19  
  354         774  
43 5     5   431 use constant DHR => (isa => HashRef, default => sub { { } });
  5         10  
  5         24  
  748         1667  
44 5     5   348 use constant NUM => (isa => Num);
  5         11  
  5         21  
45 5     5   309 use constant CODE => (isa => CodeRef);
  5         11  
  5         22  
46 5         29 use constant POINTS => (
47             x => {is => 'rw', isa => Num},
48             y => {is => 'rw', isa => Num},
49             w => {is => 'rw', isa => Num},
50             h => {is => 'rw', isa => Num},
51 5     5   449 );
  5         10  
52             use constant LINE => (
53 4         96 line => {is => 'rw', isa => Object, default => sub { Khonsu::Shape::Line->new() }}
54 5     5   557 );
  5         31  
  5         21  
55             use constant BOX => (
56 94         416 box => {is => 'rw', isa => Object, default => sub { Khonsu::Shape::Box->new() }}
57 5     5   513 );
  5         10  
  5         16  
58             use constant CIRCLE => (
59 4         33 circle => {is => 'rw', isa => Object, default => sub { Khonsu::Shape::Circle->new() }}
60 5     5   581 );
  5         10  
  5         21  
61             use constant PIE => (
62 4         37 pie => {is => 'rw', isa => Object, default => sub { Khonsu::Shape::Pie->new() }}
63 5     5   561 );
  5         8  
  5         16  
64             use constant ELLIPSE => (
65 4         43 ellipse => {is => 'rw', isa => Object, default => sub { Khonsu::Shape::Ellipse->new() }}
66 5     5   577 );
  5         11  
  5         16  
67             use constant FONT => (
68 402         1025 font => {is => 'rw', isa => Object, default => sub { Khonsu::Font->new() }}
69 5     5   550 );
  5         13  
  5         16  
70             use constant TEXT => (
71 4         44 text => {is => 'rw', isa => Object, default => sub { Khonsu::Text->new() }}
72 5     5   605 );
  5         8  
  5         17  
73             use constant H1 => (
74 4         38 h1 => {is => 'rw', isa => Object, default => sub { Khonsu::Text::H1->new() }}
75 5     5   573 );
  5         10  
  5         17  
76             use constant H2 => (
77 4         37 h2 => {is => 'rw', isa => Object, default => sub { Khonsu::Text::H2->new() }}
78 5     5   607 );
  5         19  
  5         21  
79             use constant H3 => (
80 4         44 h3 => {is => 'rw', isa => Object, default => sub { Khonsu::Text::H3->new() }}
81 5     5   554 );
  5         19  
  5         17  
82             use constant H4 => (
83 4         56 h4 => {is => 'rw', isa => Object, default => sub { Khonsu::Text::H4->new() }}
84 5     5   570 );
  5         9  
  5         15  
85             use constant H5 => (
86 4         42 h5 => {is => 'rw', isa => Object, default => sub { Khonsu::Text::H5->new() }}
87 5     5   607 );
  5         26  
  5         51  
88             use constant H6 => (
89 4         49 h6 => {is => 'rw', isa => Object, default => sub { Khonsu::Text::H6->new() }}
90 5     5   553 );
  5         12  
  5         18  
91             use constant IMAGE => (
92 4         43 image => {is => 'rw', isa => Object, default => sub { Khonsu::Image->new() }}
93 5     5   572 );
  5         26  
  5         23  
94             use constant TOC => (
95 4         41 toc => {is => 'rw', isa => Object, default => sub { Khonsu::TOC->new() }}
96 5     5   589 );
  5         10  
  5         20  
97             use constant FORM => (
98 4         45 form => {is => 'rw', isa => Object, default => sub { Khonsu::Form->new() }}
99 5     5   548 );
  5         11  
  5         14  
100             use constant INPUT => (
101 4         94 input => {is => 'rw', isa => Object, default => sub { Khonsu::Form::Field::Input->new() }}
102 5     5   551 );
  5         15  
  5         18  
103             use constant SELECT => (
104 4         45 select => {is => 'rw', isa => Object, default => sub { Khonsu::Form::Field::Select->new() }}
105 5     5   565 );
  5         15  
  5         17  
106             use constant CHECKBOX => (
107 4         56 checkbox => {is => 'rw', isa => Object, default => sub { Khonsu::Form::Field::Checkbox->new() }}
108 5     5   609 );
  5         18  
  5         22  
109             sub new {
110 1012     1012 0 3387 my ($pkg, %params) = @_;
111              
112 1012         3484 my $self = bless {
113             attributes => {}
114             }, $pkg;
115 1012         3501 my @attributes = $self->attributes();
116 1012         3520 for (my $i = 0; $i < $#attributes; $i += 2) {
117 11054         22343 my ($key, $value) = ($attributes[$i], $attributes[$i + 1]);
118 0     0   0 $self->{attributes}->{$key} = $value->{is} eq 'ro' ? sub { $_[0]->{$key}; } : sub {
119 72618     72618   116677 my ($self, $val) = @_;
120 72618 100       124887 if (defined $val) {
121 12861 100       47171 if ($value->{isa}) {
122 12853         77510 $val = $value->{isa}->($val);
123             }
124 12861         273065 $self->{$key} = $val;
125             }
126 72618         316215 return $self->{$key};
127 11054 50       54870 };
128              
129 11054 50 66     24920 if ($value->{required} && ! defined $params{$key}) {
130 0         0 die "$key is required";
131             }
132            
133 11054 100 100     25478 if ($value->{default} && !$params{$key}) {
134 4680         10381 $params{$key} = $value->{default}->($self);
135             }
136              
137 11054 100       22923 if (defined $params{$key}) {
138 7695 50       21381 if ($value->{isa}) {
139 7695         45056 $params{$key} = $value->{isa}->($params{$key});
140             }
141 7695         153801 $self->{$key} = $params{$key};
142             }
143             }
144              
145 1012         1593 for my $plugin (@{$params{PLUGINS}}) {
  1012         2548  
146 0         0 my ($key) = lc($plugin) =~ m/::([^:]*)$/;
147             $self->{attributes}->{$key} = sub {
148 0     0   0 my ($self, $val) = @_;
149 0 0       0 if (defined $val) {
150 0         0 $self->{$key} = $val;
151             }
152 0         0 return $self->{$key};
153 0         0 };
154 0         0 $self->{$key} = $plugin->new();
155             $self->{attributes}->{"add_$key"} = sub {
156 0     0   0 my ($self, %args) = @_;
157 0         0 $self->$key->add($self, %args);
158 0         0 return $self;
159 0         0 };
160             }
161              
162 1012 100       4177 $self->BUILD(%params) if $self->can('BUILD');
163            
164 1012         4905 return $self;
165             }
166              
167             sub set_points {
168 90     90 0 4766 my ($self, $mx, $my, $mw, $mh) = @_;
169 90         479 $self->x($mx);
170 90         426 $self->y($my);
171 90         408 $self->w($mw);
172 90         458 $self->h($mh);
173 90         197 return $self;
174             }
175              
176             sub get_points {
177 1892     1892 0 3354 my ($self) = shift;
178             return (
179 1892         6982 x => $self->x,
180             y => $self->y,
181             w => $self->w,
182             h => $self->h
183             );
184             }
185              
186 110     110 0 230 sub attributes { return (); }
187              
188             sub set_attributes {
189 2894     2894 0 7938 my ($self, %params) = @_;
190 2894         7021 for (keys %params) {
191 7330 100       18853 next unless $self->{attributes}->{$_};
192 5797         18588 $self->{attributes}->{$_}($self, $params{$_});
193             }
194 2894         6837 return $self;
195             }
196              
197             sub clone {
198 170     170 0 299 my ($self) = @_;
199 170         303 my $ref = ref $self;
200 170         11986 return bless Clone::clone($self), $ref;
201             }
202              
203       0     sub DESTROY {}
204              
205             sub AUTOLOAD {
206 66821     66821   283141 my $classname = ref $_[0];
207 66821         80689 my $validname = '[_a-zA-Z][\:a-zA-Z0-9_]*';
208 66821         787572 our $AUTOLOAD =~ /^${classname}::($validname)$/;
209 66821         161554 my $key = $1;
210 66821 50       127468 die "illegal key name, must be of $validname form\n$AUTOLOAD" unless $key;
211 66821 50       154857 if ( $_[0]->{attributes}->{$key} ) {
212 66821         153546 $_[0]->{attributes}->{$key}->(@_);
213             } else {
214 0           die "illegal use of AUTOLOAD $classname -> $key -";
215             }
216             }
217              
218             1;