package Camila::Number;

use 5.006;
use strict;
use warnings;

use Data::Dumper;
use Camila::Boolean;
use Camila::Prototype;
use Camila::String;

require Exporter;

our @ISA = qw(Exporter);
our %EXPORT_TAGS = ( 'all' => [ qw() ] );
our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
our @EXPORT = qw();


our $VERSION = '0.01';

BEGIN {
  Camila::Prototype::register('itoa', 'STR', ['INT'],
			      sub{ "Camila::Number::itoa($_[0][1])" } );

  Camila::Prototype::register('add', 'INT', ['INT','INT'],
			      sub{ "Camila::Number::add($_[0][1],$_[1][1])" } );

  Camila::Prototype::register('sub', 'INT', ['INT','INT'],
			      sub{ "Camila::Number::subt($_[0][1],$_[1][1])"} );

  Camila::Prototype::register('div', 'INT', ['INT','INT'],
			      sub{ "Camila::Number::div($_[0][1],$_[1][1])" } );

  Camila::Prototype::register('mul', 'INT', ['INT','INT'],
			      sub{ "Camila::Number::mul($_[0][1],$_[1][1])" } );

  Camila::Prototype::register('equal','BOOL',['INT','INT'],
			      sub{ "Camila::Number::equal($_[0][1],$_[1][1])" } );

  Camila::Prototype::register('lt','BOOL',['INT','INT'],
			      sub{ "Camila::Number::lthan($_[0][1],$_[1][1])" } );
}

sub add {
   my ($l,$r) = @_; return bless( +{ number => $l->{number} + $r->{number} } )
}
sub subt {
   my ($l,$r) = @_; return bless( +{ number => $l->{number} - $r->{number} } )
}
sub div  {
  my ($l,$r) = @_;
  # TODO: Check what we should return
  $r->{number}?bless( +{ number => $l->{number} / $r->{number} } ):undef;
}
sub mul  {
   my ($l,$r) = @_; return bless( +{ number => $l->{number} * $r->{number} } ) 
}

sub equal {
  my ($l,$r) = @_;
  if ($l->{number} == $r->{number}) {
    return Camila::Boolean::true
  } else {
    return Camila::Boolean::false
  }
}

sub lthan {
  my ($l,$r) = @_;
  return ($l->{number}<$r->{number})?Camila::Boolean::true:Camila::Boolean::false;
}

sub new { return new_from_value(@_) }
sub new_from_value {
  my $value = shift;
  return bless( +{ number => $value })
}

sub show { return $_[0]->{number} }
sub value { return show(shift) }
sub repr { return Dumper(shift) }

sub itoa { return Camila::String::new($_[0]->{number}) }

1;
__END__

=head1 NAME

Camila::Number - Perl module extension for managing numbers for Camila

=head1 SYNOPSIS

  use Camila::Number;

  $object = Camila::Number::new( 5 );

  $object = Camila::Number::new_from_value( 10 );

=head1 DESCRIPTION




=head1 AUTHOR

Alberto Simões, E<lt>albie@alfarrabio.di.uminho.ptE<gt>

=head1 SEE ALSO

L<Camila> and L<perl>.

=cut
