class SolverEventSupport<Solution_> extends AbstractEventSupport<SolverEventListener<Solution_>> {

    private final Solver<Solution_> solver;

    public SolverEventSupport(Solver<Solution_> solver) {
        this.solver = solver;
    }

    public void fireBestSolutionChanged(SolverScope<Solution_> solverScope, Solution_ newBestSolution) {<FILL_FUNCTION_BODY>}

}

        final Iterator<SolverEventListener<Solution_>> it = getEventListeners().iterator();
        long timeMillisSpent = solverScope.getBestSolutionTimeMillisSpent();
        Score bestScore = solverScope.getBestScore();
        if (it.hasNext()) {
            final BestSolutionChangedEvent<Solution_> event = new BestSolutionChangedEvent<>(solver,
                    timeMillisSpent, newBestSolution, bestScore);
            do {
                it.next().bestSolutionChanged(event);
            } while (it.hasNext());
        }
    
<methods>public non-sealed void <init>() ,public void addEventListener(SolverEventListener<Solution_>) ,public void removeEventListener(SolverEventListener<Solution_>) <variables>private final List<SolverEventListener<Solution_>> eventListenerList