File Coverage

blib/lib/Boolean/Converter.pm
Criterion Covered Total %
statement 35 35 100.0
branch 9 10 90.0
condition 2 3 66.6
subroutine 12 12 100.0
pod 4 5 80.0
total 62 65 95.3


line stmt bran cond sub pod time code
1             package Boolean::Converter;
2 3     3   44610 use 5.008001;
  3         9  
3 3     3   14 use strict;
  3         4  
  3         61  
4 3     3   18 use warnings;
  3         5  
  3         209  
5              
6             our $VERSION = "0.01";
7              
8 3     3   20 use Carp qw/croak/;
  3         5  
  3         200  
9 3     3   14 use List::Util qw/reduce/;
  3         3  
  3         257  
10 3     3   2273 use overload ();
  3         1819  
  3         1401  
11              
12             our %DEFAULT_EVALUATE_METHODS = ();
13             our %DEFAULT_CONVERT_METHODS = (
14             'JSON::PP' => sub { $_[0] ? JSON::PP::true() : JSON::PP::false() },
15             'JSON::XS' => sub { $_[0] ? JSON::XS::true() : JSON::XS::false() },
16             'Types::Serialiser' => sub { $_[0] ? Types::Serialiser::true() : Types::Serialiser::false() },
17             'Data::MessagePack' => sub { $_[0] ? Data::MessagePack::true() : Data::MessagePack::false() },
18             'boolean' => sub { $_[0] ? boolean::true() : boolean::false() },
19             );
20              
21             sub new {
22 4     4 1 2401 my ($class, %args) = @_;
23             return bless {
24             evaluator => {
25             %DEFAULT_EVALUATE_METHODS,
26 4 100       36 %{ $args{evaluator} || +{} },
27             },
28             converter => {
29             %DEFAULT_CONVERT_METHODS,
30 4 100       11 %{ $args{converter} || +{} },
  4         44  
31             },
32             } => $class;
33             }
34              
35             sub can_evaluate {
36 12     12 1 16344 my ($self, $value) = @_;
37 12 100       47 return !!1 unless ref $value;
38             return exists $self->{evaluator}->{ref $value}
39 30     30   373 || reduce { $a || $b } map {
40 11   66     81 overload::Method($value, $_)
41             } qw/0+ bool int !/;
42             }
43              
44             sub evaluate {
45 35     35 1 1433 my ($self, $value) = @_;
46 35         81 my $converter = $self->{evaluator}->{ref $value};
47 35 100       90 return $converter->($value) if $converter;
48 33         329 return !!$value;
49             }
50              
51             sub can_convert_to {
52 5     5 0 19733 my ($self, $klass) = @_;
53 5         40 return exists $self->{converter}->{$klass};
54             }
55              
56             sub convert_to {
57 21     21 1 6584 my ($self, $value, $klass) = @_;
58 21         49 my $boolean = $self->evaluate($value);
59 21 50       147 my $converter = $self->{converter}->{$klass}
60             or croak "Unsupported class: $klass";
61 21         50 return $converter->($boolean);
62             }
63              
64             1;
65             __END__