Add convenience constructors and refactor