refactor ElementMaker. more flexibility