private Queue<Operation> recursiveOperation(final Node<T> origin, final Node<T> destination, final boolean isAdd) {
if (isAdd) {
Engine.neighborAdded(this, origin, destination);
} else {
Engine.neighborRemoved(this, origin, destination);
}
final Neighborhood<T> newNeighborhood = rule.computeNeighborhood(Objects.requireNonNull(destination), this);
final Neighborhood<T> oldNeighborhood = neighCache.put(destination.getId(), newNeighborhood);
return toQueue(destination, oldNeighborhood, newNeighborhood);
}