package Point; use Carp 'croak'; sub new { croak('…') unless @_ == 3; my ( $class, $x, $y ) = @_; return bless { x => $x, y => $y } => $class; } sub x { croak('…') unless @_ == 1 || @_ == 2; my $self = shift if ( @_ ) { $self->{x} = shift; } return $self->{x}; } sub y { croak('…') unless @_ == 1 || @_ == 2; my $self = shift if ( @_ ) { $self->{y} = shift; } return $self->{y}; } sub inverted { croak('…') unless @_ == 1; my $self = shift; return Point->new( $self->y, $self->x ); } 1;