package Foo; use warnings; use strict; my %data = qw/foo bar/; our $AUTOLOAD; sub AUTOLOAD { my ($self, @args) = @_; my ($pkg, $field) = (__PACKAGE__, $AUTOLOAD); $field =~ s/${pkg}:://; ## uncommenting any of these, makes the code work #%data; #() = %data; #map $_, %data; #map $_, \%data; #$::qwerty123 = %data; eval "*$field = sub { return \\%$field; };"; $@ and die "eval failed: $@\n"; goto &$field; } 1;