File Coverage

blib/lib/Enbld/Target/Attribute.pm
Criterion Covered Total %
statement 48 48 100.0
branch 14 14 100.0
condition 3 3 100.0
subroutine 10 10 100.0
pod 0 7 0.0
total 75 82 91.4


line stmt bran cond sub pod time code
1             package Enbld::Target::Attribute;
2              
3 19     19   888 use strict;
  19         26  
  19         642  
4 19     19   78 use warnings;
  19         26  
  19         489  
5              
6 19     19   10596 use Module::Load::Conditional qw/can_load/;
  19         443438  
  19         9291  
7              
8             require Enbld::Exception;
9              
10             sub new {
11 1404     1404 0 2999 my ( $class, $name, $param ) = @_;
12              
13 1404 100       2547 if ( ! $name ) {
14 1         8 Enbld::Exception->throw( "'$class' requires name" );
15             }
16              
17 1403         2033 my $module = "Enbld::Target::Attribute::$name";
18              
19 1403 100       4992 can_load( modules => { $module => 0 } ) or
20             Enbld::Exception->throw( "Attribute '$name' is invalid name" );
21              
22 1402         119102 my $self = {
23             attributes => undef,
24             value => undef,
25             callback => undef,
26             is_evaluated => undef,
27             };
28              
29 1402         5347 bless $self, $module;
30              
31 1402         6171 $self->initialize( $param );
32              
33 1384         4000 return $self;
34             }
35              
36             sub initialize {
37 714     714 0 891 my ( $self, $param ) = @_;
38              
39 714 100       1608 if ( ref( $param ) eq 'CODE' ) {
40 44         77 $self->{callback} = $param;
41 44         88 return $self;
42             }
43              
44 670         1160 $self->{value} = $param;
45 670         783 $self->{is_evaluated}++;
46 670         1021 return $self;
47             }
48              
49             sub validate {
50 1135     1135 0 1237 my ( $self, $string ) = @_;
51              
52 1135 100       1834 if ( ! $string ) {
53 13         41 my $type = ref( $self );
54 13         57 $type =~ s/.*:://;
55 13         82 Enbld::Exception->throw( "Attribute '$type' is empty string" );
56             }
57              
58 1122 100       1849 if ( ref( $string ) ) {
59 15         32 my $type = ref( $self );
60 15         60 $type =~ s/.*:://;
61 15         88 Enbld::Exception->throw( "Attribute '$type' isn't scalar value" );
62             }
63              
64 1107         1638 return $string;
65             }
66              
67             sub evaluate {
68 1509     1509 0 1414 my $self = shift;
69              
70 1509 100       4769 return $self->{value} if $self->{is_evaluated};
71            
72 316         1100 $self->{value} = $self->{callback}->( $self->{attributes} );
73 315         580 $self->{is_evaluated}++;
74              
75 315         530 return $self->{value};
76             }
77              
78             sub to_value {
79 1306     1306 0 1402 my $self = shift;
80              
81 1306         2904 my $value = $self->evaluate;
82              
83 1305 100 100     3562 return '' if ( ( ! $value ) && $self->is_omitable );
84              
85 1182         4323 $self->validate( $value );
86              
87 1133         6243 return $value;
88             }
89              
90             sub is_omitable {
91 13     13 0 61 return; # if attribute is not omitable, override this method in sub class.
92             }
93              
94             sub link_to_collector {
95 1384     1384 0 1572 my ( $self, $collector ) = @_;
96              
97 1384         2510 $self->{attributes} = $collector;
98             }
99              
100             1;