Spreadsheet::Engine::Fn::math - base class for math functions


Spreadsheet-Engine documentation Contained in the Spreadsheet-Engine distribution.

Index


Code Index:

NAME

Top

Spreadsheet::Engine::Fn::math - base class for math functions

SYNOPSIS

Top

  use base 'Spreadsheet::Engine::Fn::math';

  sub calculate { ... }

DESCRIPTION

Top

This provides a base class for spreadsheet functions that perform mathematical functions on a single argument (ABS(), SIN(), SQRT() etc).

Subclasses should provide 'calculate' function that will be called with the argument provided.

INSTANCE METHODS

Top

calculate

Subclasses should provide this as the workhorse. It should either return the result, or die with an error message (that will be trapped and turned into a e#NUM! error).

arg_check

Before calulate is called, an arg_check subref, if provided, will be called to check that the argument passed to the function is acceptable. This is an interim step towards proper argument validation. Be careful about relying on it.

HISTORY

Top

This is a Modified Version of code extracted from SocialCalc::Functions in SocialCalc 1.1.0

COPYRIGHT

Top

LICENCE

Top

The contents of this file are subject to the Artistic License 2.0; you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.perlfoundation.org/artistic_license_2_0


Spreadsheet-Engine documentation Contained in the Spreadsheet-Engine distribution.

package Spreadsheet::Engine::Fn::math;

use strict;
use warnings;

use base 'Spreadsheet::Engine::Fn::base';

use constant PI => atan2(1, 1) * 4;
use constant JULIAN_OFFSET => 2_415_019;

sub signature        { 'n' }
sub _result_type_key { 'oneargnumeric' }

sub result_type {
  my $self = shift;
  return $self->optype($self->_result_type_key => $self->_ops);
}

sub result {
  my $self = shift;
  my $type = $self->result_type;
  die $type unless $type->is_num;

  return Spreadsheet::Engine::Value->new(
    type  => $type->type,
    value => $self->calculate(map $_->value, $self->_ops),
  );
}

1;

__END__