@Override
  protected void collectNavigationMarkers(
      @NotNull PsiElement element, Collection<? super RelatedItemLineMarkerInfo> result) {
    if (element instanceof PerlNamespaceDefinition) {
      PsiElement nameIdentifier = ((PerlNamespaceDefinition) element).getNameIdentifier();
      if (nameIdentifier == null) nameIdentifier = element;

      List<PerlNamespaceDefinition> parentNamespaces =
          ((PerlNamespaceDefinition) element).getParentNamespaceDefinitions();
      if (parentNamespaces.size() > 0) {
        NavigationGutterIconBuilder<PsiElement> builder =
            NavigationGutterIconBuilder.create(AllIcons.Gutter.ImplementingMethod)
                .setTargets(parentNamespaces)
                .setTooltipText("Parent classes");

        result.add(builder.createLineMarkerInfo(nameIdentifier));
      }

      Collection<PerlNamespaceDefinition> childNamespaces =
          ((PerlNamespaceDefinition) element).getChildNamespaceDefinitions();
      if (childNamespaces.size() > 0) {
        NavigationGutterIconBuilder<PsiElement> builder =
            NavigationGutterIconBuilder.create(AllIcons.Gutter.ImplementedMethod)
                .setTargets(childNamespaces)
                .setTooltipText("Subclasses");

        result.add(builder.createLineMarkerInfo(nameIdentifier));
      }

    } else if (element instanceof PerlSubDefinitionBase
        && ((PerlSubDefinitionBase) element).isMethod()) {
      PerlNamespaceDefinition containingNamespace =
          PsiTreeUtil.getParentOfType(element, PerlNamespaceDefinition.class);
      if (containingNamespace != null) {
        final String packageName = ((PerlSubDefinitionBase) element).getPackageName();
        final String subName = ((PerlSubDefinitionBase) element).getSubName();
        PsiElement nameIdentifier = ((PerlSubDefinitionBase) element).getNameIdentifier();
        if (nameIdentifier == null) nameIdentifier = element;

        if (StringUtil.isNotEmpty(packageName) && StringUtil.isNotEmpty(subName)) {
          Collection<PsiElement> superMethods =
              PerlMro.resolveSub(element.getProject(), packageName, subName, true);
          if (superMethods.size() > 0) {
            NavigationGutterIconBuilder<PsiElement> builder =
                NavigationGutterIconBuilder.create(AllIcons.Gutter.OverridingMethod)
                    .setTargets(superMethods)
                    .setTooltipText("Overriding method");

            result.add(builder.createLineMarkerInfo(nameIdentifier));
          }

          final List<PerlSubBase> overridingSubs = new ArrayList<PerlSubBase>();

          PerlPackageUtil.processChildNamespacesSubs(
              containingNamespace,
              null,
              new Processor<PerlSubBase>() {
                @Override
                public boolean process(PerlSubBase perlSubBase) {
                  String subBaseName = perlSubBase.getSubName();
                  if (StringUtil.isNotEmpty(subBaseName)
                      && subName.equals(subBaseName)
                      && perlSubBase.isMethod()) {
                    overridingSubs.add(perlSubBase);
                    return false;
                  }
                  return true;
                }
              });

          if (overridingSubs.size() > 0) {
            NavigationGutterIconBuilder<PsiElement> builder =
                NavigationGutterIconBuilder.create(AllIcons.Gutter.OverridenMethod)
                    .setTargets(overridingSubs)
                    .setTooltipText("Overriden methods");

            result.add(builder.createLineMarkerInfo(nameIdentifier));
          }
        }
      }
    }
  }