refactor
support nonnumeric validity
support null validity
refactor
refactor