class ModuleAnalyser {

    public List<AnalyserModel.AnalysisResult> analyse(final List<Definition> definitions) {
        if (definitions.isEmpty()) {
            return new ArrayList<>();
        } else {
            final Pair<AccessVisitor, List<Supplier<AnalyserModel.AnalysisResult>>> visitorAndAnalysis = visitorAndAnalysis(
                    definitions);
            try {
                classParser.parse(root, visitorAndAnalysis.first);
            } catch (IOException e) {
                throw new AnalyserException(e);
            }
            return visitorAndAnalysis.second.stream().map(Supplier::get).collect(Collectors.toList());
        }
    }

    public  ModuleAnalyser(final ClassParser classParser, final ClasspathRoot root, Optional<Integer> evidenceLimit,
            ModuleGraphFactory factory);

}