#!/usr/bin/perl

# Idiom #281 Use a Point as a map key

package Point {
    sub new { my $class = shift; bless { @_ }, $class }    

    sub x { shift->{x} };
    sub y { shift->{y} };
    
    use overload '""' => sub { shift->_stringify() };   

    sub _stringify {
        my $self = shift;
        return sprintf "(%s, %s)", $self->x, $self->y; 
    }
}

my %m;
my @points;
foreach my $x (1..3) {
    foreach my $y (10..12) {
        my $p = Point->new(x => $x, y => $y);               
        push @points, $p;
        $m{$p} = $p;
    }
} 

for (1..5) {
    my $r = $points[ int rand @points ];
    printf "picked point %s got point %s\n", $r, $m{$r};
}


# for the posted idiom

my %m;
my $p = Point->new(x => 42, y => 5);
$m{$p} = 'Hello';

print "$p = $m{$p}";