use preconditions