protected boolean tryPopuateValue(LocationEnvironment environment,
			ActivityInstance activityInstance,
			ActivityContext resolutionContext,
			Object value,
			Location resultLocation) {
		if (value != null) {
			Helper.assertNull(resultLocation);
			Location location = new Location();
			environment.declare(this, location, activityInstance);
			location.setValue(value);
			return true;
		}

		if (this.getBoundArgument().getExpression() != null) {
			// TODO skip fastpath
			// Location location = new Location();
			// environment.declare(this, location, activityInstance);

			// NOTE fast-path as some type of argument just refer to another argument
			resolutionContext.setActivity(this.getBoundArgument().getExpression());
			return this.boundArgument.tryPopulateValue(environment, activityInstance, resolutionContext);
		}

		if (resultLocation != null && this.getOwner().isResultArgument(this)) {
			// NOTE here only works for resultArgument
			// FIXME resultLocation should be referenceLocation, not direct
			environment.declare(this, resultLocation, activityInstance);
			return true;
		}

		// only declare location but no value
		Location location = new Location();
		environment.declare(this, location, activityInstance);
		return true;
	}