#!/usr/bin/perl

# Idiom #268 User-defined operator
# https://p...content-available-to-author-only...s.org/idiom/268

use v5.10;

package Vector {
    sub new {
        my ($class, $x, $y, $z) = @_;
        bless [$x,$y,$z], $class;
    }
    sub x { shift->[0] };
    sub y { shift->[1] };
    sub z { shift->[2] };
    
    use overload 'x'  => sub { shift->xprod(shift) };
    use overload '""' => sub { shift->_stringify() };

    sub xprod {
        my ($self,$v) = @_;
        return Vector->new(
            $self->y * $v->z - $self->z * $v->y,
            $self->z * $v->x - $self->x * $v->z,
            $self->x * $v->y - $self->y * $v->x,
        );
    }

    sub _stringify { 
    	my $self = shift; 
    	return '(' . join(',',@{$self}) . ')' 
    }
}

my $a = Vector->new(3, 4, 5);
my $b = Vector->new(5, 10, 1);

my $cross = $a x $b;

say "$a x $b = ", $cross;