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