sub foo : lvalue { $dat{ +shift }->{ 'foo' } } #### dat_attr foo; #### package Class::Attr::Lvalue; use Filter::Simple; FILTER { s/(\w+)_attr (\w+)(\s*);/sub $2$3: lvalue { \$$1\{ +shift }->{ '$2' $3 } }/g; # print; } 1;