these should probably be final if they're used as pool objects, ie to avoid reallocation.