better memory management: less new() -> less pressure on GC