File Coverage

blib/lib/boolean.pm
Criterion Covered Total %
statement 39 48 81.2
branch 24 28 85.7
condition n/a
subroutine 15 16 93.7
pod 6 8 75.0
total 84 100 84.0


line stmt bran cond sub pod time code
1 4     4   69687 use strict; use warnings;
  4     4   7  
  4         137  
  4         15  
  4         5  
  4         414  
2             package boolean;
3             our $VERSION = '0.45';
4              
5             my ($true, $false);
6              
7             use overload
8 111     111   10604 '""' => sub { ${$_[0]} },
  111         304  
9 16 100   16   17 '!' => sub { ${$_[0]} ? $false : $true },
  16         517  
10 4     4   3403 fallback => 1;
  4         2669  
  4         49  
11              
12 4     4   301 use base 'Exporter';
  4         7  
  4         1655  
13             @boolean::EXPORT = qw(true false boolean);
14             @boolean::EXPORT_OK = qw(isTrue isFalse isBoolean);
15             %boolean::EXPORT_TAGS = (
16             all => [@boolean::EXPORT, @boolean::EXPORT_OK],
17             test => [qw(isTrue isFalse isBoolean)],
18             );
19              
20             sub import {
21 7     7   73 my @options = grep $_ ne '-truth', @_;
22 7 50       21 $_[0]->truth if @options != @_;
23 7         13 @_ = @options;
24 7         5728 goto &Exporter::import;
25             }
26              
27             my ($true_val, $false_val, $bool_vals);
28              
29             BEGIN {
30 4     4   8 my $t = 1;
31 4         6 my $f = 0;
32 4         4 $true = do {bless \$t, 'boolean'};
  4         9  
33 4         7 $false = do {bless \$f, 'boolean'};
  4         6  
34              
35 4         13 $true_val = overload::StrVal($true);
36 4         25 $false_val = overload::StrVal($false);
37 4         1289 $bool_vals = {$true_val => 1, $false_val => 1};
38             }
39              
40 52     52 1 270 sub true() { $true }
41 42     42 1 6988 sub false() { $false }
42             sub boolean($) {
43 14 100   14 1 1367 die "Not enough arguments for boolean::boolean" if scalar(@_) == 0;
44 13 100       32 die "Too many arguments for boolean::boolean" if scalar(@_) > 1;
45 12 100       48 return not(defined $_[0]) ? false :
    100          
46             "$_[0]" ? $true : $false;
47             }
48             sub isTrue($) {
49 6 100   6 1 27 not(defined $_[0]) ? false :
    50          
50             (overload::StrVal($_[0]) eq $true_val) ? true : false;
51             }
52             sub isFalse($) {
53 9 100   9 1 37 not(defined $_[0]) ? false :
    100          
54             (overload::StrVal($_[0]) eq $false_val) ? true : false;
55             }
56             sub isBoolean($) {
57 14 100   14 1 51 not(defined $_[0]) ? false :
    100          
58             (exists $bool_vals->{overload::StrVal($_[0])}) ? true : false;
59             }
60              
61             sub truth {
62 0 0   0 0 0 die "-truth not supported on Perl 5.22 or later" if $] >= 5.021005;
63             # enable modifying true and false
64 0         0 &Internals::SvREADONLY( \ !!0, 0);
65 0         0 &Internals::SvREADONLY( \ !!1, 0);
66             # turn perl internal booleans into blessed booleans:
67 0         0 ${ \ !!0 } = $false;
  0         0  
68 0         0 ${ \ !!1 } = $true;
  0         0  
69             # make true and false read-only again
70 0         0 &Internals::SvREADONLY( \ !!0, 1);
71 0         0 &Internals::SvREADONLY( \ !!1, 1);
72             }
73              
74 3 100   3 0 6 sub TO_JSON { ${$_[0]} ? \1 : \0 }
  3         86  
75              
76             1;