$ cat foo.pl use strict; use warnings; sub new_vec { return bless { vec=>[ @_ ] }, 'flarb' }; my $a = new_vec(1, 2, 3); my $b = new_vec(1, 4, 9); my $t = InProduct($a, $b); print "t=$t\n"; sub InProduct { my ($a, $b) = @_; return $a->X*$b->X + $a->Y*$b->Y + $a->Z*$b->Z; } package flarb; sub X { my $self=shift; return $self->{vec}[0] }; sub Y { my $self=shift; return $self->{vec}[1] }; sub Z { my $self=shift; return $self->{vec}[2] }; $ perl foo.pl t=36