generic toString (should be standard?)