File Coverage

inc/boolean.pm
Criterion Covered Total %
statement 27 51 52.9
branch 1 28 3.5
condition n/a
subroutine 8 17 47.0
pod 0 8 0.0
total 36 104 34.6


line stmt bran cond sub pod time code
1 68     68   464 use strict; use warnings;
  68     68   169  
  68         2756  
  68         356  
  68         183  
  68         10546  
2             package boolean;
3             our $VERSION = '0.46';
4              
5             my ($true, $false);
6              
7             use overload
8 0     0   0 '""' => sub { ${$_[0]} },
  0         0  
9 0 0   0   0 '!' => sub { ${$_[0]} ? $false : $true },
  0         0  
10 68     68   46544 fallback => 1;
  68         131172  
  68         842  
11              
12 68     68   6997 use base 'Exporter';
  68         126  
  68         24678  
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 68     68   306 my @options = grep $_ ne '-truth', @_;
22 68 50       340 $_[0]->truth if @options != @_;
23 68         240 @_ = @options;
24 68         4894 goto &Exporter::import;
25             }
26              
27             my ($true_val, $false_val, $bool_vals);
28              
29             BEGIN {
30 68     68   336 my $t = 1;
31 68         157 my $f = 0;
32 68         159 $true = do {bless \$t, 'boolean'};
  68         287  
33 68         154 $false = do {bless \$f, 'boolean'};
  68         179  
34              
35 68         340 $true_val = overload::StrVal($true);
36 68         675 $false_val = overload::StrVal($false);
37 68         37709 $bool_vals = {$true_val => 1, $false_val => 1};
38             }
39              
40             # refaddrs change on thread spawn, so CLONE fixes them up
41             sub CLONE {
42 0     0   0 $true_val = overload::StrVal($true);
43 0         0 $false_val = overload::StrVal($false);
44 0         0 $bool_vals = {$true_val => 1, $false_val => 1};
45             }
46              
47 67     67 0 235 sub true() { $true }
48 67     67 0 824618 sub false() { $false }
49             sub boolean($) {
50 0 0   0 0   die "Not enough arguments for boolean::boolean" if scalar(@_) == 0;
51 0 0         die "Too many arguments for boolean::boolean" if scalar(@_) > 1;
52 0 0         return not(defined $_[0]) ? false :
    0          
53             "$_[0]" ? $true : $false;
54             }
55             sub isTrue($) {
56 0 0   0 0   not(defined $_[0]) ? false :
    0          
57             (overload::StrVal($_[0]) eq $true_val) ? true : false;
58             }
59             sub isFalse($) {
60 0 0   0 0   not(defined $_[0]) ? false :
    0          
61             (overload::StrVal($_[0]) eq $false_val) ? true : false;
62             }
63             sub isBoolean($) {
64             not(defined $_[0]) ? false :
65 0 0   0 0   (exists $bool_vals->{overload::StrVal($_[0])}) ? true : false;
    0          
66             }
67              
68             sub truth {
69 0 0   0 0   die "-truth not supported on Perl 5.22 or later" if $] >= 5.021005;
70             # enable modifying true and false
71 0           &Internals::SvREADONLY( \ !!0, 0);
72 0           &Internals::SvREADONLY( \ !!1, 0);
73             # turn perl internal booleans into blessed booleans:
74 0           ${ \ !!0 } = $false;
  0            
75 0           ${ \ !!1 } = $true;
  0            
76             # make true and false read-only again
77 0           &Internals::SvREADONLY( \ !!0, 1);
78 0           &Internals::SvREADONLY( \ !!1, 1);
79             }
80              
81 0 0   0 0   sub TO_JSON { ${$_[0]} ? \1 : \0 }
  0            
82              
83             1;