@Override
	public void controlObject(GObject target, Context context) {
		if (tick > duration) {
			// We've been reused. Get out.
			return;
		}

		// Is this our first run?
		if (tick == 0) {
			// We may have other tweens that should be run at the same time.
			for (TweenController tween : with) {
				// Add the controller.
				target.addController(tween);

				// Since it won't be invoked until next frame (and will be one
				// frame off), invoke it manually to get it on track.
				tween.controlObject(target, context);
			}
		}

		// Interpolate!
		interpolate(target, context,
				interpolationType.calculateInterpolation(tick, duration));

		// Advance.
		tick++;

		// Are we done now?
		if (tick > duration) {
			// We're done. Remove ourself.
			target.removeController(this);

			// Do we chain?
			if (next != null) {
				// Do so.
				target.addController(next);
			}
		}
	}