docs: public static void fillProcessorAttributes(
              final List<Processor> processors,
              final Map<String, Attribute> initialAttributes) {
          Map<String, Attribute> currentAttributes = new HashMap<>(initialAttributes);
          for (Processor processor: processors) {
              if (processor instanceof RequireAttributes) {
                  for (ProcessorDependencyGraphFactory.InputValue inputValue:
                          ProcessorDependencyGraphFactory.getInputs(processor)) {
                      if (inputValue.type == Values.class) {
                          if (processor instanceof CustomDependencies) {
                              for (String attributeName: ((CustomDependencies) processor).getDependencies()) {
                                  Attribute attribute = currentAttributes.get(attributeName);
                                  if (attribute != null) {
                                      ((RequireAttributes) processor).setAttribute(
                                              attributeName, currentAttributes.get(attributeName));
                                  }
                              }
  
                          } else {
                              for (Map.Entry<String, Attribute> attribute: currentAttributes.entrySet()) {
                                  ((RequireAttributes) processor).setAttribute(
                                          attribute.getKey(), attribute.getValue());
                              }
                          }
                      } else {
                          try {
                              ((RequireAttributes) processor).setAttribute(
                                      inputValue.internalName,
                                      currentAttributes.get(inputValue.name));
                          } catch (ClassCastException e) {
                              throw new IllegalArgumentException(String.format("The processor '%s' requires " +
                                                                                       "the attribute '%s' " +
                                                                                       "(%s) but he has the " +
                                                                                       "wrong type:\n%s",
                                                                               processor, inputValue.name,
                                                                               inputValue.internalName,
                                                                               e.getMessage()), e);
                          }
                      }
                  }
              }
              if (processor instanceof ProvideAttributes) {
                  Map<String, Attribute> newAttributes = ((ProvideAttributes) processor).getAttributes();
                  for (ProcessorDependencyGraphFactory.OutputValue ouputValue:
                          ProcessorDependencyGraphFactory.getOutputValues(processor)) {
                      currentAttributes.put(
                              ouputValue.name, newAttributes.get(ouputValue.internalName));
                  }
              }
          }
      }