File Coverage

blib/lib/Astro/Units.pm
Criterion Covered Total %
statement 79 79 100.0
branch 7 8 87.5
condition 2 3 66.6
subroutine 42 42 100.0
pod 31 31 100.0
total 161 163 98.7


line stmt bran cond sub pod time code
1             package Astro::Units;
2              
3 1     1   121858 use strict;
  1         2  
  1         22  
4 1     1   4 use warnings;
  1         1  
  1         20  
5              
6 1     1   4 use Carp;
  1         1  
  1         48  
7              
8 1     1   5 use bignum;
  1         2  
  1         6  
9 1     1   1116 use Math::BigFloat;
  1         1  
  1         4  
10              
11             Math::BigFloat->config({
12             div_scale => 0,
13             accuracy => undef,
14             });
15              
16             our $VERSION = '1.10';
17             use constant {
18 1         6 ONE_LIGHT_YEAR => Math::BigFloat->new('9_460_730_472_580.8'),
19             ONE_LIGHT_WEEK => Math::BigFloat->new('181_314_478_598.399_9'),
20             ONE_LIGHT_DAY => Math::BigFloat->new('25_902_068_371.199_997'),
21             ONE_LIGHT_HOUR => Math::BigFloat->new('1_079_252_848.8'),
22             ONE_LIGHT_MINUTE => Math::BigFloat->new('17_987_547.48'),
23             ONE_LIGHT_SECOND => Math::BigFloat->new('299_792.458'),
24             ONE_AU => Math::BigFloat->new('149_597_870.7'),
25             ONE_PARSEC => Math::BigFloat->new('30_856_775_814_914.218_05'),
26             ONE_MILE => Math::BigFloat->new('1.609_344'),
27 1     1   660 };
  1         1  
28              
29             sub new {
30 2     2 1 68 my $class = shift;
31 2         6 my %args = @_;
32 2         2 my $self = {};
33 2 100 66     11 if (exists $args{unit} && defined $args{unit}) {
34 1         38 my $u = lc (substr($args{unit},0,1) );
35 1 50       97 croak("Invalid unit use Either (Miles or Kilometers) or (mi or km) Default is Kilometers\n")
36             unless ( $u =~ /^(m|k)/i);
37 1         3 $self->{unit} = $u;
38             } else {
39 1         3 $self->{unit} = 'k';
40             }
41 2         6 return bless($self, $class);
42             }
43              
44             sub _clean {
45 66     66   81 my $raw_string = shift;
46 66         357 $raw_string =~ s/([a-zA-Z\s_,\s])//g;
47 66         1033 return $raw_string;
48             }
49              
50             #atrological units to km/mi
51 6     6 1 5357 sub get_astronomical_units { return _calculate(@_, ONE_AU) }
52              
53 4     4 1 5412 sub get_light_years { return _calculate( @_, ONE_LIGHT_YEAR) }
54              
55 2     2 1 1144 sub get_light_week { return _calculate( @_, ONE_LIGHT_WEEK) }
56              
57 2     2 1 1077 sub get_light_days { return _calculate( @_, ONE_LIGHT_DAY) }
58              
59 2     2 1 1077 sub get_light_hours { return _calculate( @_, ONE_LIGHT_HOUR) }
60              
61 2     2 1 1090 sub get_light_minutes { return _calculate( @_, ONE_LIGHT_MINUTE)}
62              
63 2     2 1 1123 sub get_light_seconds { return _calculate( @_, ONE_LIGHT_SECOND) }
64              
65 2     2 1 1040 sub get_light_parsecs { return _calculate( @_, ONE_PARSEC) }
66              
67             #reverse function km/mi to astro
68 2     2 1 1132 sub convert_to_astronomical_units { return _reverse_calculate(@_, ONE_AU) }
69              
70 2     2 1 571 sub convert_to_light_years { return _reverse_calculate( @_, ONE_LIGHT_YEAR) }
71              
72 2     2 1 547 sub convert_to_light_weeks { return _reverse_calculate( @_, ONE_LIGHT_WEEK) }
73              
74 2     2 1 537 sub convert_to_light_days { return _reverse_calculate( @_, ONE_LIGHT_DAY) }
75              
76 2     2 1 544 sub convert_to_light_hours { return _reverse_calculate( @_, ONE_LIGHT_HOUR) }
77              
78 2     2 1 551 sub convert_to_light_minutes { return _reverse_calculate( @_, ONE_LIGHT_MINUTE)}
79              
80 2     2 1 573 sub convert_to_light_seconds { return _reverse_calculate( @_, ONE_LIGHT_SECOND) }
81              
82 2     2 1 502 sub convert_to_light_parsec { return _reverse_calculate( @_, ONE_PARSEC) }
83              
84             #Asu to light units miles/kilometers not applicable
85              
86 2     2 1 598 sub au_to_light_years { return _au_to_light(@_, ONE_LIGHT_YEAR) }
87              
88 2     2 1 563 sub au_to_light_weeks { return _au_to_light( @_, ONE_LIGHT_WEEK) }
89              
90 2     2 1 561 sub au_to_light_days { return _au_to_light( @_, ONE_LIGHT_DAY) }
91              
92 2     2 1 633 sub au_to_light_hours { return _au_to_light( @_, ONE_LIGHT_HOUR) }
93              
94 2     2 1 571 sub au_to_light_minutes { return _au_to_light( @_, ONE_LIGHT_MINUTE) }
95              
96 2     2 1 552 sub au_to_light_seconds { return _au_to_light( @_, ONE_LIGHT_SECOND)}
97              
98 2     2 1 550 sub au_to_light_parsecs { return _au_to_light( @_, ONE_PARSEC) }
99              
100             #light units to astronomical units miles/kilometers not applicable
101              
102 2     2 1 561 sub light_years_to_au { return _light_to_au(@_, ONE_LIGHT_YEAR) }
103              
104 2     2 1 554 sub light_weeks_to_au { return _light_to_au( @_, ONE_LIGHT_WEEK) }
105              
106 2     2 1 565 sub light_days_to_au { return _light_to_au( @_, ONE_LIGHT_DAY) }
107              
108 2     2 1 554 sub light_hours_to_au { return _light_to_au( @_, ONE_LIGHT_HOUR) }
109              
110 2     2 1 605 sub light_minutes_to_au { return _light_to_au( @_, ONE_LIGHT_MINUTE) }
111              
112 2     2 1 544 sub light_seconds_to_au { return _light_to_au( @_, ONE_LIGHT_SECOND)}
113              
114 2     2 1 875 sub light_parsecs_to_au { return _light_to_au( @_, ONE_PARSEC) }
115              
116             sub _calculate {
117 22     22   41 my ($self,$raw_inp,$multiplier) = @_;
118 22         31 my $inp = Math::BigFloat->new(_clean($raw_inp));
119 22         3368 my $res = $inp->bmul($multiplier);
120 22 100       9722 return $self->{unit} eq 'm' ? $res->bdiv(ONE_MILE) : $res;
121             }
122              
123             sub _reverse_calculate {
124 16     16   46 my ($self,$raw_inp,$divisor) = @_;
125 16         25 my $inp = Math::BigFloat->new(_clean($raw_inp));
126 16 100       1766 $inp = $inp->bmul(ONE_MILE) if ($self->{unit} eq 'm');
127 16         1455 my $res = $inp->bdiv($divisor);
128 16         9870 return $res;
129             }
130              
131             sub _au_to_light {
132 14     14   23 my ($self,$raw_inp,$divisor) = @_;
133 14         26 my $inp = Math::BigFloat->new(_clean($raw_inp));
134 14         919 my $au_km = $inp->bmul(ONE_AU);
135 14         1774 my $res = $au_km->bdiv($divisor);
136 14         8247 return $res;
137             }
138              
139             sub _light_to_au {
140 14     14   24 my ($self,$raw_inp,$multiplier) = @_;
141 14         23 my $inp = Math::BigFloat->new(_clean($raw_inp));
142 14         895 my $lu_km = $inp->bmul($multiplier);
143 14         1693 my $res = $lu_km->bdiv(ONE_AU);
144 14         8208 return $res;
145             }
146              
147             1;
148              
149             __END__