custom validators + abstraction