1# $Id: Number.pm,v 1.1.1.2 2007/10/10 23:04:14 ahuda Exp $
2
3package XML::LibXML::Number;
4use XML::LibXML::Boolean;
5use XML::LibXML::Literal;
6use strict;
7
8use vars qw ($VERSION);
9$VERSION = "1.65"; # VERSION TEMPLATE: DO NOT CHANGE
10
11use overload
12        '""' => \&value,
13        '0+' => \&value,
14        '<=>' => \&cmp;
15
16sub new {
17    my $class = shift;
18    my $number = shift;
19    if ($number !~ /^\s*(-\s*)?(\d+(\.\d*)?|\.\d+)\s*$/) {
20        $number = undef;
21    }
22    else {
23        $number =~ s/\s+//g;
24    }
25    bless \$number, $class;
26}
27
28sub as_string {
29    my $self = shift;
30    defined $$self ? $$self : 'NaN';
31}
32
33sub as_xml {
34    my $self = shift;
35    return "<Number>" . (defined($$self) ? $$self : 'NaN') . "</Number>\n";
36}
37
38sub value {
39    my $self = shift;
40    $$self;
41}
42
43sub cmp {
44    my $self = shift;
45    my ($other, $swap) = @_;
46    if ($swap) {
47        return $other <=> $$self;
48    }
49    return $$self <=> $other;
50}
51
52sub evaluate {
53    my $self = shift;
54    $self;
55}
56
57sub to_boolean {
58    my $self = shift;
59    return $$self ? XML::LibXML::Boolean->True : XML::LibXML::Boolean->False;
60}
61
62sub to_literal { XML::LibXML::Literal->new($_[0]->as_string); }
63sub to_number { $_[0]; }
64
65sub string_value { return $_[0]->value }
66
671;
68__END__
69
70=head1 NAME
71
72XML::LibXML::Number - Simple numeric values.
73
74=head1 DESCRIPTION
75
76This class holds simple numeric values. It doesn't support -0, +/- Infinity,
77or NaN, as the XPath spec says it should, but I'm not hurting anyone I don't think.
78
79=head1 API
80
81=head2 new($num)
82
83Creates a new XML::LibXML::Number object, with the value in $num. Does some
84rudimentary numeric checking on $num to ensure it actually is a number.
85
86=head2 value()
87
88Also as overloaded stringification. Returns the numeric value held.
89
90=cut
91