function decorator
type-checked attributes using descriptor