package Angle; use strict; use warnings; use constant PI => 4*atan2( 1, 1); use constant RAD => 180/PI; sub cre { bless \ my $angle, shift } sub new { my $class = shift; $class->Angle::cre->Angle::init( @_); } sub init { my $obj = shift; $$obj = _get_angle( @_); $obj; } sub rad { ${ shift() } }; sub deg { ${ shift() }*RAD } sub _get_angle { my $angle; if ( @_ == 1 ) { $angle = shift; } else { my %spec = @_; $angle = exists $spec{ deg} ? $spec{ deg}/RAD : $spec{ rad}; } modulo( $angle, 2*PI); } use POSIX; sub modulo { my ( $x, $y) = @_; $y ? $x - $y*POSIX::floor( $x/$y) : $x; } 1;