use lazy vars and assigned closures instead of iVars