more tests
add __toString()
optimize performance