implement applyTo and do some optimise