#!/usr/bin/perl
# Idiom #282 Use a custom type as map key
# https://p...content-available-to-author-only...s.org/idiom/282/use-a-custom-type-as-map-key/6042/perl
use v5.10;
use Data::Dumper;
use Scalar::Util 'refaddr';
use overload '""' => sub { shift->_stringify() };
sub _stringify {
my $x = $self->x;
return "object $x: " . refaddr
$self; }
sub x
{ my $self = shift; $self->{x
} // '' };
};
my $p = Foo->new(x => 5);
say '$p->x is ', $p->x;
$map{$p} = 'some data';
IyEvdXNyL2Jpbi9wZXJsCiMgSWRpb20gIzI4MiBVc2UgYSBjdXN0b20gdHlwZSBhcyBtYXAga2V5CiMgaHR0cHM6Ly9wLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLm9yZy9pZGlvbS8yODIvdXNlLWEtY3VzdG9tLXR5cGUtYXMtbWFwLWtleS82MDQyL3BlcmwKCnVzZSB2NS4xMDsKdXNlIERhdGE6OkR1bXBlcjsKCnBhY2thZ2UgRm9vIHsKICAgdXNlIFNjYWxhcjo6VXRpbCAncmVmYWRkcic7CiAgICAKICAgdXNlIG92ZXJsb2FkICciIicgPT4gc3ViIHsgc2hpZnQtPl9zdHJpbmdpZnkoKSB9OwogIAogICAgc3ViIF9zdHJpbmdpZnkgewogICAgICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgICAgbXkgJHggPSAkc2VsZi0+eDsKICAgICAgICByZXR1cm4gIm9iamVjdCAkeDogIiAuIHJlZmFkZHIgJHNlbGY7CiAgICB9CiAgICBzdWIgeCB7IG15ICRzZWxmID0gc2hpZnQ7ICRzZWxmLT57eH0gLy8gJycgfTsKICAgIAogICAgc3ViIG5ldyB7IG15ICRjbGFzcyA9IHNoaWZ0OyByZXR1cm4gYmxlc3MgeyBAXyB9LCAkY2xhc3MgfSAgICAKfTsKIApteSAkcCA9IEZvby0+bmV3KHggPT4gNSk7CnNheSAnJHAtPnggaXMgJywgJHAtPng7CgpteSAlbWFwOwoKJG1hcHskcH0gPSAnc29tZSBkYXRhJzsKCnNheSBEdW1wZXIgXCVtYXA7Cg==