public class ChainedMoveUtils {
public static void doChainedChange(ScoreDirector scoreDirector, Object entity,
GenuineVariableDescriptor variableDescriptor, Object toPlanningValue) {
// TODO HACK Avoid downcast
InnerScoreDirector innerScoreDirector = (InnerScoreDirector) scoreDirector;
Object oldValue = variableDescriptor.getValue(entity);
Object oldTrailingEntity = innerScoreDirector.getTrailingEntity(variableDescriptor, entity);
// If chaining == true then toPlanningValue == null guarantees an uninitialized entity
Object newTrailingEntity = toPlanningValue == null ? null
: innerScoreDirector.getTrailingEntity(variableDescriptor, toPlanningValue);
// Close the old chain
if (oldTrailingEntity != null) {
scoreDirector.beforeVariableChanged(variableDescriptor, oldTrailingEntity);
}