explanation of requires/optional and non_empty