use v5.24;
use warnings;
package GeoPoint;
use overload '""' => \&gist;
sub Longitude {
my ($lon) = @_;
die "Not a valid longitude"
unless $lon >= -180 and $lon <= 180;
return $lon;
}
sub Latitude {
my ($lat) = @_;
die "Not a valid latitude"
unless $lat >= -90 and $lat <= 90;
return $lat;
}
sub new {
my ($class, %o) = @_;
my $lat = Latitude($o{lat});
my $lon = Longitude($o{lon});
bless { lat => $lat, lon => $lon }, $class;
}
sub lat {
my $self = shift;
if (@_) { $self->{lat} = shift }
return $self->{lat};
}
sub lon {
my $self = shift;
if (@_) { $self->{lon} = shift }
return $self->{lon};
}
sub gist {
my $self = shift;
return
($self->{lat} >= 0 ? "N$self->{lat}" : "S" . -$self->{lat}) . " " .
($self->{lon} >= 0 ? "E$self->{lon}" : "W" . -$self->{lon})
}
my $geo = GeoPoint->new(lat => 39.1915045, lon => -96.6070506);
say $geo->lat; # 39.1915045
say $geo->lon; # -96.6070506
say $geo; # N39.1915045 W96.6070506