> But this goes closer to the CORE now than to a module. > > my Dog $foo :confine; This is an excellent point. I will extend the module so that it exports a MODIFY_SCALAR_ATTRIBUTES to UNIVERSAL (and perhaps a PREPARE to caller()). Then users have a plethora of choice: use Class::TypedVars; # Proposed new name for Class::ifiedVars # then: classify $foo => 'Dog'; # Dam-ian interface # or: type DogsOnly => 'Dog'; # Dam-ian typed interface DogsOnly ($foo); # or: my Dog $foo : constrain; # Ily-ian attributed interface # or: tie $foo, 'Class::TypedVars'; # Ily-ian "killer" interface :-) # or: package Dog; use Class::TypedVars; package main; my Dog $foo; # Stealth interface That should be enough choice of APIs for anyone ;-) Note, that the attribute/PREPARE-based interfaces (which I do like) are insufficient in the general case, since they doesn't cater for constraining assignments to package vars, array elements, or hash entries. Damian