use associated object instead of ivar