could use is_callable() instead of method_exists() so it will also work when __toString() is accidently non-public