File Coverage

blib/lib/XAO/Errors.pm
Criterion Covered Total %
statement 103 116 88.7
branch 12 26 46.1
condition 1 3 33.3
subroutine 29 32 90.6
pod 0 2 0.0
total 145 179 81.0


line stmt bran cond sub pod time code
1             =head1 NAME
2              
3             XAO::Errors - throwable errors namespace support
4              
5             =head1 SYNOPSIS
6              
7             package XAO::Fubar;
8             use XAO::Errors qw(XAO::Fubar);
9              
10             sub foo {
11             ...
12             throw XAO::E::Fubar "foo - wrong arguments";
13             }
14              
15             =head1 DESCRIPTION
16              
17             Magic module that creates error namespaces for caller's. Should be
18             used in situations like that. Say you create a XAO module called
19             XAO::DO::Data::Product and want to throw errors from it. In order for
20             these errors to be distinguishable you need separate namespace for
21             them -- that's where XAO::Errors comes to rescue.
22              
23             In the bizarre case when you want more then one namespace for
24             errors - you can pass these namespaces into XAO::Errors and it will
25             make them throwable. It does not matter what to pass to XAO::Errors -
26             the namespace of an error or the namespace of the package, the result
27             would always go into XAO::E namespace.
28              
29             =cut
30              
31             ###############################################################################
32             package XAO::Errors;
33 8     8   55 use strict;
  8         17  
  8         243  
34 8     8   3725 use Error;
  8         26458  
  8         42  
35              
36 8     8   518 use vars qw($VERSION);
  8         16  
  8         615  
37             $VERSION=(0+sprintf('%u.%03u',(q$Id: Errors.pm,v 2.1 2005/01/13 22:34:34 am Exp $ =~ /\s(\d+)\.(\d+)\s/))) || die "Bad VERSION";
38              
39 8     8   51 use vars qw(%errors_cache);
  8         15  
  8         2644  
40              
41             sub load_e_class ($) {
42 44     44 0 117 my $module=shift;
43 44         63 my $em;
44 44 100       380 if($module=~/^XAO::E((::\w+)+)$/) {
    50          
45 4         25 $em=$module;
46 4         18 $module='XAO' . $1;
47             }
48             elsif($module=~/^XAO((::\w+)+)$/) {
49 40         143 $em='XAO::E' . $1;
50             }
51             else {
52 0         0 throw Error::Simple "Can't import error module for $module";
53             }
54              
55 44 100       499 return $em if $errors_cache{$em};
56              
57 8 50   8   54 eval <
  8 50   8   70  
  8 50   8   211  
  8 0   8   39  
  8 0   8   25  
  8 0   8   29  
  8     8   587  
  8     8   16  
  8     8   834  
  8     8   58  
  8     8   18  
  8     8   204  
  8     4   42  
  8     4   17  
  8     4   39  
  8     2   593  
  8     2   25  
  8     2   869  
  8     4   53  
  8     3   23  
  8     1   251  
  8     0   66  
  8     0   16  
  8     0   59  
  8         613  
  8         30  
  8         865  
  8         58  
  8         17  
  8         193  
  8         37  
  8         23  
  8         88  
  8         602  
  8         26  
  8         904  
  4         28  
  4         8  
  4         107  
  4         28  
  4         9  
  4         34  
  4         335  
  4         8  
  4         493  
  2         14  
  2         11  
  2         46  
  2         19  
  2         6  
  2         20  
  2         182  
  2         58  
  2         240  
  38         3095  
  4         285  
  4         35  
  4         69  
  4         76  
  3         8  
  3         6  
  3         14  
  3         24  
  1         4  
  1         4  
  1         7  
  1         33  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
58              
59             package $em;
60             use strict;
61             use Error;
62             use vars qw(\@ISA);
63             \@ISA=qw(Error::Simple);
64              
65             sub throw {
66             my \$self=shift;
67             my \$text=join('',map { defined(\$_) ? \$_ : '' } \@_);
68             \$self->SUPER::throw('${module}::' . \$text);
69             }
70              
71             1;
72             END
73 38 50       143 throw Error::Simple $@ if $@;
74 38         105 $errors_cache{$em}=1;
75              
76 38         2487 return $em;
77             }
78              
79             sub import {
80 43     43   898 my $class=shift;
81 43         135 my @list=@_;
82              
83 43         1438 foreach my $module (@list) {
84 40         110 load_e_class($module);
85             }
86             }
87              
88             sub throw_by_class ($$$) {
89              
90 4 50 33 4 0 37 @_==2 || @_==3 ||
91             throw Error::Simple "throw_by_class - number of arguments is not 2 or 3";
92              
93 4 50       27 my $self=(@_==3) ? shift : 'XAO::Errors';
94 4         10 my $class=shift;
95 4 50       15 $class=ref($class) if ref($class);
96              
97 4         9 my $text=shift;
98              
99 4         16 my $em=load_e_class($class);
100              
101             ##
102             # Most probably will screw up stack trace, need to check and fix!
103             #
104 8     8   88 no strict 'refs';
  8         17  
  8         553  
105 4         162 $em->throw($text);
106             }
107              
108             ###############################################################################
109             1;
110             __END__