1. add chaining support
2. add _toString() method
3. change some behaviour
4. fix some bugs