/** Finds an operation in the given classifier. */
 public static Operation findOperation(
     IRepository repository,
     Classifier classifier,
     String operationName,
     List<TypedElement> arguments,
     ParameterSubstitutionMap substitutions,
     boolean ignoreCase,
     boolean recurse) {
   for (Operation operation : classifier.getOperations()) {
     if (isMatch(operation, operationName, ignoreCase)
         && (arguments == null || isMatch(repository, operation, arguments, substitutions)))
       return operation;
   }
   if (!recurse) return null;
   Operation found;
   final EList<TemplateBinding> templateBindings = classifier.getTemplateBindings();
   if (!templateBindings.isEmpty())
     for (TemplateBinding templateBinding : templateBindings) {
       TemplateSignature signature = templateBinding.getSignature();
       ParameterSubstitutionMap newSubstitutions = new ParameterSubstitutionMap(templateBinding);
       found =
           findOperation(
               repository,
               (Classifier) signature.getTemplate(),
               operationName,
               arguments,
               newSubstitutions,
               ignoreCase,
               true);
       if (found != null) return found;
     }
   for (Generalization generalization : classifier.getGeneralizations())
     if ((found =
             findOperation(
                 repository,
                 generalization.getGeneral(),
                 operationName,
                 arguments,
                 substitutions,
                 ignoreCase,
                 true))
         != null) return found;
   return null;
 }
 public static Property findAttribute(
     Classifier classifier, String attributeIdentifier, boolean ignoreCase, boolean recurse) {
   Property found = classifier.getAttribute(attributeIdentifier, null, ignoreCase, null);
   if (found != null || !recurse) return found;
   final EList<TemplateBinding> templateBindings = classifier.getTemplateBindings();
   if (!templateBindings.isEmpty()) {
     for (TemplateBinding templateBinding : templateBindings) {
       TemplateSignature signature = templateBinding.getSignature();
       found =
           findAttribute(
               (Classifier) signature.getTemplate(), attributeIdentifier, ignoreCase, true);
       if (found != null) return found;
     }
   }
   for (Generalization generalization : classifier.getGeneralizations())
     if ((found =
             findAttribute(generalization.getGeneral(), attributeIdentifier, ignoreCase, true))
         != null) return found;
   return null;
 }