File Coverage

lib/Template/Exception.pm
Criterion Covered Total %
statement 42 42 100.0
branch 8 8 100.0
condition 3 3 100.0
subroutine 13 13 100.0
pod 2 7 28.5
total 68 73 93.1


line stmt bran cond sub pod time code
1             #============================================================= -*-Perl-*-
2             #
3             # Template::Exception
4             #
5             # DESCRIPTION
6             # Module implementing a generic exception class used for error handling
7             # in the Template Toolkit.
8             #
9             # AUTHOR
10             # Andy Wardley
11             #
12             # COPYRIGHT
13             # Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved.
14             #
15             # This module is free software; you can redistribute it and/or
16             # modify it under the same terms as Perl itself.
17             #
18             #========================================================================
19              
20             package Template::Exception;
21              
22 92     92   1491 use strict;
  92         90  
  92         2054  
23 92     92   277 use warnings;
  92         80  
  92         1805  
24 92     92   256 use constant TYPE => 0;
  92         80  
  92         4454  
25 92     92   316 use constant INFO => 1;
  92         109  
  92         3378  
26 92     92   303 use constant TEXT => 2;
  92         96  
  92         3648  
27 92     92   84336 use overload q|""| => "as_string", fallback => 1;
  92         71271  
  92         421  
28              
29             our $VERSION = 2.70;
30              
31              
32             #------------------------------------------------------------------------
33             # new($type, $info, \$text)
34             #
35             # Constructor method used to instantiate a new Template::Exception
36             # object. The first parameter should contain the exception type. This
37             # can be any arbitrary string of the caller's choice to represent a
38             # specific exception. The second parameter should contain any
39             # information (i.e. error message or data reference) relevant to the
40             # specific exception event. The third optional parameter may be a
41             # reference to a scalar containing output text from the template
42             # block up to the point where the exception was thrown.
43             #------------------------------------------------------------------------
44              
45             sub new {
46 167     167 0 357 my ($class, $type, $info, $textref) = @_;
47 167         1024 bless [ $type, $info, $textref ], $class;
48             }
49              
50              
51             #------------------------------------------------------------------------
52             # type()
53             # info()
54             # type_info()
55             #
56             # Accessor methods to return the internal TYPE and INFO fields.
57             #------------------------------------------------------------------------
58              
59             sub type {
60 199     199 1 1580 $_[0]->[ TYPE ];
61             }
62              
63             sub info {
64 76     76 1 995 $_[0]->[ INFO ];
65             }
66              
67             sub type_info {
68 1     1 0 1 my $self = shift;
69 1         4 @$self[ TYPE, INFO ];
70             }
71              
72             #------------------------------------------------------------------------
73             # text()
74             # text(\$pretext)
75             #
76             # Method to return the text referenced by the TEXT member. A text
77             # reference may be passed as a parameter to supercede the existing
78             # member. The existing text is added to the *end* of the new text
79             # before being stored. This facility is provided for template blocks
80             # to gracefully de-nest when an exception occurs and allows them to
81             # reconstruct their output in the correct order.
82             #------------------------------------------------------------------------
83              
84             sub text {
85 140     140 0 159 my ($self, $newtextref) = @_;
86 140         196 my $textref = $self->[ TEXT ];
87            
88 140 100       215 if ($newtextref) {
    100          
89 128 100 100     434 $$newtextref .= $$textref if $textref && $textref ne $newtextref;
90 128         140 $self->[ TEXT ] = $newtextref;
91 128         190 return '';
92             }
93             elsif ($textref) {
94 11         31 return $$textref;
95             }
96             else {
97 1         2 return '';
98             }
99             }
100              
101              
102             #------------------------------------------------------------------------
103             # as_string()
104             #
105             # Accessor method to return a string indicating the exception type and
106             # information.
107             #------------------------------------------------------------------------
108              
109             sub as_string {
110 443     443 0 1603 my $self = shift;
111 443         1358 return $self->[ TYPE ] . ' error - ' . $self->[ INFO ];
112             }
113              
114              
115             #------------------------------------------------------------------------
116             # select_handler(@types)
117             #
118             # Selects the most appropriate handler for the exception TYPE, from
119             # the list of types passed in as parameters. The method returns the
120             # item which is an exact match for TYPE or the closest, more
121             # generic handler (e.g. foo being more generic than foo.bar, etc.)
122             #------------------------------------------------------------------------
123              
124             sub select_handler {
125 123     123 0 1397 my ($self, @options) = @_;
126 123         185 my $type = $self->[ TYPE ];
127 123         142 my %hlut;
128 123         312 @hlut{ @options } = (1) x @options;
129              
130 123         267 while ($type) {
131 134 100       319 return $type if $hlut{ $type };
132              
133             # strip .element from the end of the exception type to find a
134             # more generic handler
135 97         517 $type =~ s/\.?[^\.]*$//;
136             }
137 86         209 return undef;
138             }
139            
140             1;
141              
142             __END__