Adding more of a declarative nature to Perl's object model is an interesting thing to do. What problem does this solve? To me, one of the appeals of dynamic languages like Perl, Ruby, and Smalltalk is that they
don't have rigid type systems. That is: if my object supports the desired operations, it has the right type, regardless of what its superclasses are. Although your solution at least doesn't require specific inheritance, it
does differentiate between blessed objects and regular scalars. But what if I had a blessed object that overloads '+' and other numeric operations and I want to use it instead of an integer for
age above? Your scheme doesn't check
dynamic type, only static type. That is, why do we want age to be an integer? Because we have some preconditions? Because we're doing math with it? Why can't I substitute an object of my choice that supports the required behavior?
It does seem to me that you're trying to work around the major discrepancy in the Perl type system — not everything is an object. Maybe this solves real-world problems, I don't know. I guess it solves some problem you were having or you wouldn't have written it.
My own experience with Perl is that type errors are a rare source of bugs. Of course, I mostly use objects, but I rarely run into problems because of number/string distinctions. (Perhaps those dealing with relational databases would care more, but this hasn't been a problem for me, since I don't).