refactor, add options, remove `return this`