always re-raise on argument exception, refactor into smaller methods