don't use ivar directly