# -*- Perl -*- use strict; use warnings; package Matrix::Named; use Scalar::Util qw/refaddr/; use base 'Matrix'; { my %name; #### 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; #### #!/usr/local/bin/perl use strict; use warnings; $| = 1; use Vi::QuickFix; # Definition of MyAngle below my $alpha = MyAngle->new( rad => atan2( 1, 1)); printf "Angle: %s (%s deg)\n", $alpha->rad, $alpha->deg; # Angle functions print "Matrix:\n$alpha\n"; # show the matrix representation ################################################## package MyAngle; use lib 'lib'; use base 'Angle'; use base 'Matrix'; sub new { my $class = shift; $class->Angle::cre->MyAngle::init( @_); } sub init { my $obj = shift; $obj->Angle::init( @_); $obj->Matrix::init( cos( $_), -sin( $_), sin( $_), cos( $_)) for $obj->rad; $obj; } __END__