This would work, but has a couple of minor issues:
- We've added another layer of indirection. Means that direct access is a little slower.
- We have to mention the "name" of the object attribute twice (the xx in $$xx and qw/xx private/.
- It's more work if you don't want the accessors.
If we want to name an object attribute explicitly we could do it with a modified :Field attribute. For example, something like this wouldn't be hard to implement.
my %foo : Field; # no accessor
my %foo : Field(as foo); # create accessor named foo
While easy to implement, it still has the duplication of names... which offends :-)