code: public void transform(List<S> transformables, long elapsedTime)
  	{
  		for (S transformable : transformables)
  			transform(transformable, elapsedTime);
  	}
  
  	/**
  	 * Applies this {@link Transformation} to the {@link ITransformable}
  	 *
  	 * @param transformable the transformable
  	 * @param elapsedTime the elapsed time
  	 */
  	public void transform(S transformable, long elapsedTime)
  	{
  		doTransform(transformable, completion(Math.max(0, elapsedTime)));
  	}
  
  	/**
  	 * Calculates the completion of this {@link Transformation} based on the movement and the elapsed time.
  	 *
  	 * @param elapsedTime the elapsed time
  	 * @return the float
  	 */
  	protected float completion(long elapsedTime)
  	{
  		if (duration == 0)
  			return 0;
  
  		float comp = 0;
  		long loopDuration = getLoopDuration();
  		elapsedTimeCurrentLoop = elapsedTime - delay;
  
  		if (loops != -1 && elapsedTimeCurrentLoop > loops * loopDuration)
  			return 1;
  
  		if (loops != 1)
  		{
  			elapsedTimeCurrentLoop %= loopDuration;
  			if (elapsedTimeCurrentLoop < loopStartDelay)
  				return 0;
  			if (elapsedTimeCurrentLoop + loopResetDelay > loopDuration)
  				return 1;
  			elapsedTimeCurrentLoop -= loopStartDelay;
  		}
  
  		comp = Math.min((float) elapsedTimeCurrentLoop / duration, 1);
  		comp = Math.max(0, Math.min(1, comp));
  		if (movement == SINUSOIDAL)
  		{
  			comp = (float) (1 - Math.cos(comp * Math.PI)) / 2;
  		}
  
  		//MalisisCore.message(comp);
  		return comp;
  	}
docs: Applies this {@link Transformation} to the {@link ITransformable}.
  
  @param transformables the transformables
  @param elapsedTime the elapsed time