#!/usr/bin/perl use v5.12; use warnings FATAL => 'all'; package Attr; use Carp; my %attr = (one => 1, two => 2); sub new { my $class = shift; bless {}, $class; } our $AUTOLOAD; # Generic setter/getter sub AUTOLOAD { my $self = shift; my $called = $AUTOLOAD =~ s/.*:://r; croak "$AUTOLOAD: no such method" unless exists $attr{$called}; if (@_ > 0) { $self->{$called} = shift; } else { return $self->{$called}; } } package main; my $attr = Attr->new; $attr->one('uno'); say $attr->one; eval {say $attr->three}; say $@ if $@; __DATA__ uno Attr::three: no such method at /home/jo/Programs/play-scripts/pm-11125489.pl line 38.