validation, error messages & abstraction