package Point; use Moose; has 'x' => (is => 'bare', isa => 'Int'); has 'y' => (is => 'bare', isa => 'Int'); sub move { my ($self, $direction, $distance) = @_; $self->meta->name->new( x => ($direction eq 'x' ? $self->{x} + $distance : $self->{x}), y => ($direction eq 'y' ? $self->{y} + $distance : $self->{y}) ); } sub scale { my ($self, $factor) = @_; $self->meta->name->new( x => ($self->{x} * $factor), y => ($self->{y} * $factor) ); }