File Coverage

blib/lib/Exception/FFI/ErrorCode.pm
Criterion Covered Total %
statement 62 67 92.5
branch 6 8 75.0
condition 2 6 33.3
subroutine 14 15 93.3
pod n/a
total 84 96 87.5


line stmt bran cond sub pod time code
1             package Exception::FFI::ErrorCode 0.01 {
2              
3 1     1   193236 use warnings;
  1         5  
  1         25  
4 1     1   17 use 5.020;
  1         3  
5 1     1   4 use constant 1.32 ();
  1         10  
  1         17  
6 1     1   504 use experimental qw( signatures postderef );
  1         2920  
  1         4  
7 1     1   647 use Ref::Util qw( is_plain_arrayref );
  1         1460  
  1         102  
8              
9             # ABSTRACT: Exception class based on integer error codes common in C code
10              
11              
12             my %human_codes;
13              
14             sub import ($, %args)
15 1     1   9 {
  1         8  
  1         1  
16 1   33     7 my $class = $args{class} || caller;
17              
18             {
19 1     1   7 no strict 'refs';
  1         2  
  1         227  
  1         2  
20 1         1 push @{ "$class\::ISA" }, 'Exception::FFI::ErrorCode::Base';
  1         9  
21             }
22              
23 1   33     6 my $const_class = $args{const_class} || $class;
24              
25 1         3 foreach my $name (keys $args{codes}->%*)
26             {
27 2         4 my($code, $human) = do {
28 2         2 my $v = $args{codes}->{$name};
29 2 100       8 is_plain_arrayref $v ? @$v : ($v,$name);
30             };
31 2         62 constant->import("$const_class\::$name", $code);
32 2         1949 $human_codes{$class}->{$code} = $human;
33             }
34             }
35              
36             package Exception::FFI::ErrorCode::Base 0.01 {
37              
38 1     1   403 use Class::Tiny qw( package filename line code );
  1         1537  
  1         3  
39 1     1   549 use Ref::Util qw( is_blessed_ref );
  1         5  
  1         87  
40             use overload
41 0     0   0 '""' => sub { shift->as_string },
42 1     1   7 bool => sub { 1 }, fallback => 1;
  1     3   2  
  1         11  
  3         52  
43              
44 3         6 sub throw ($proto, @rest)
45 3     3   6570 {
  3         4  
  3         4  
46 3         8 my($package, $filename, $line) = caller;
47              
48 3         5 my $self;
49 3 50       11 if(is_blessed_ref $proto)
50             {
51 0         0 $self = $proto;
52 0         0 $self->package($package);
53 0         0 $self->filename($filename);
54 0         0 $self->line($line);
55             }
56             else
57             {
58 3         12 $self = $proto->new(
59             @rest,
60             package => $package,
61             filename => $filename,
62             line => $line
63             );
64             }
65 3         231 die $self;
66             }
67              
68             sub strerror ($self)
69 6     6   5238 {
  6         8  
  6         8  
70 6         106 my $code = $self->code;
71 6 50       33 $code = 0 unless defined $code;
72 6         15 my $str = $human_codes{ref $self}->{$code};
73 6 100       36 $str = sprintf "%s error code %s", ref $self, $self->code unless defined $str;
74 6         56 return $str;
75             }
76              
77             sub as_string ($self)
78 3     3   469 {
  3         4  
  3         4  
79 3         6 sprintf "%s at %s line %s.", $self->strerror, $self->filename, $self->line;
80             }
81             }
82             }
83              
84             1;
85              
86             __END__