1package Math::Calc::Units::Convert::Combo;
2use base 'Math::Calc::Units::Convert::Base2Metric';
3use strict;
4use vars qw(%units %metric_units %prefixable_metric_units %total_unit_map);
5use vars qw(%ranges %pref);
6
7%units = (
8);
9
10%metric_units = (
11);
12
13%prefixable_metric_units = ( bps => [ 1, { bit => 1, sec => -1 } ] );
14
15%ranges = ( default => [ 1, 999 ] );
16
17%pref = ( default => 1 );
18
19sub canonical_unit { return; }
20
21sub unit_map {
22    my ($self) = @_;
23    if (keys %total_unit_map == 0) {
24	%total_unit_map = (%{$self->SUPER::unit_map()},
25			   %units,
26			   %metric_units,
27			   %prefixable_metric_units);
28    }
29    return \%total_unit_map;
30}
31
32# Singular("Mbps") is Mbps, not Mbp
33sub singular {
34    my ($self, $unit) = @_;
35    return $self->SUPER::singular($unit) unless $unit =~ /bps$/;
36    return $unit;
37}
38
39# demetric : string => mult x base
40#
41sub demetric {
42    my ($self, $string) = @_;
43    if (my $prefix = $self->get_prefix($string)) {
44	my $tail = lc($self->singular(substr($string, length($prefix))));
45	if ($metric_units{$tail}) {
46	    return ($self->get_metric($prefix), $tail);
47	}
48    } elsif (my $abbrev = $self->get_abbrev_prefix($string)) {
49	my $tail = lc($self->singular(substr($string, length($abbrev))));
50	if ($prefixable_metric_units{$tail}) {
51	    my $prefix = $self->get_abbrev($abbrev);
52	    return ($self->get_metric($prefix), $tail);
53	}
54    }
55
56    return (1, $string);
57}
58
59# to_canonical : unitName -> amount x unitName
60#
61sub to_canonical { return; }
62
63sub lookup_compound {
64    my ($self, $unitName) = @_;
65
66    foreach (keys %units, keys %metric_units, keys %prefixable_metric_units) {
67	if (my $mult = $self->simple_convert($unitName, $_)) {
68	    my $u = $units{$_}
69	            || $metric_units{$_}
70	            || $prefixable_metric_units{$_};
71	    return [ $mult * $u->[0], $u->[1] ];
72	}
73    }
74
75    return;
76}
77
78sub get_ranges {
79    return \%ranges;
80}
81
82sub get_prefs {
83    return \%pref;
84}
85
861;
87