# Autoattr.pm package Autoattr; our $DEBUG; sub new($) { $DEBUG and printf STDERR "%s::new(%s)\n", __PACKAGE__, join ', ', map "'$_'", @_; ref $_[0] ? bless {%{$_[0]}}, ref $_[0] : bless {}, $_[0]; } sub DESTROY { $DEBUG and printf STDERR "%s::DESTROY(%s)\n", __PACKAGE__, join ', ', map "'$_'", @_; return; } sub AUTOLOAD { no strict qw(refs); our $AUTOLOAD; $DEBUG and printf STDERR "%s::AUTOLOAD=%s(%s)\n", __PACKAGE__, $AUTOLOAD, join ', ', map "'$_'", @_; if ($AUTOLOAD =~ /:get_([^:]*)$/) { my $attr = $1; *{$AUTOLOAD} = sub {$_[0]->{$attr}}; } elsif ($AUTOLOAD =~ /:set_([^:]*)$/) { my $attr = $1; *{$AUTOLOAD} = sub {$_[0]->{$attr} = $_[1]; $_[0]}; } else { (my $get = $AUTOLOAD) =~ s/([^:]*)$/get_$1/; (my $set = $AUTOLOAD) =~ s/([^:]*)$/set_$1/; *{$AUTOLOAD} = sub {goto \&{$#_ ? $set : $get}}; } goto \&$AUTOLOAD; } 1;