private Option<Descriptor<T>> lookupDescriptor(String symbol, CNode config) {
        Stream<Descriptor<T>> descriptors = getDescriptors();
        return descriptors
                .filter(descriptor ->
                        findByPreferredSymbol(descriptor, symbol) || findBySymbols(descriptor, symbol, config))
                .map(descriptor -> Tuple.of(preferredSymbol(descriptor), descriptor))
                .foldLeft(HashMap.empty(), this::handleDuplicateSymbols)
                .values()
                .headOption()
                .orElse(() -> {
                    List<String> availableImplementations = descriptors
                            .toJavaStream()
                            .map(d -> DescribableAttribute.getPreferredSymbol(d, getImplementedAPI(), target))
                            .collect(Collectors.toList());

                    throw new UnknownAttributesException(
                            this,
                            "No implementation found for:",
                            "No " + target.getName() + " implementation found for " + symbol,
                            symbol,
                            availableImplementations);
                });
    }
Matches suitable descriptors for the target.
The fetch is trivial when the target implements a root {@link Describable} object.
If not, we iterate to parent classes until we find a class which can provide the descriptor list in {@link Jenkins#getDescriptorList(Class)}.
Then we go through all the descriptors and find ones compliant with the target.
@return Stream of descriptors which match the target
plugin/src/main/java/io/jenkins/plugins/casc/impl/configurators/HeteroDescribableConfigurator.java