public Result compare() {
            SmithyBuilder.requiredState("oldModel", oldModel);
            SmithyBuilder.requiredState("newModel", newModel);

            List<DiffEvaluator> evaluators = new ArrayList<>();
            ServiceLoader.load(DiffEvaluator.class, classLoader).forEach(evaluators::add);
            Differences differences = Differences.detect(oldModel, newModel);

            // Applies suppressions and elevates event severities.
            ValidationEventDecorator decoratorResult = new ModelBasedEventDecorator()
                    .createDecorator(newModel)
                    .getResult()
                    .orElse(ValidationEventDecorator.IDENTITY);

            List<ValidationEvent> diffEvents = evaluators.parallelStream()
                    .flatMap(evaluator -> evaluator.evaluate(differences).stream())
                    // No need to call canDecorate first since that method will always return true in any code path.
                    .map(decoratorResult::decorate)
                    .collect(Collectors.toList());

            return new Result(differences, diffEvents, oldModelEvents, newModelEvents);
        }
Performs the diff of the old and new models.

@return Returns the diff {@link Result}.
@throws IllegalStateException if {@code oldModel} and {@code newModel} are not set.
smithy-diff/src/main/java/software/amazon/smithy/diff/ModelDiff.java