private static ExtensionClassAndMethodMatcher createPointCut(
     final Extension extension,
     final Extension.Instrumentation.Pointcut cut,
     final String metricPrefix,
     final String pName,
     final Map<String, MethodMapper> classesToMethods,
     final boolean custom,
     final InstrumentationType type,
     final boolean isAttsEnabled)
     throws XmlException {
   ClassMatcher classMatcher;
   if (cut.getMethodAnnotation() != null) {
     classMatcher = new AllClassesMatcher();
   } else {
     classMatcher = createClassMatcher(cut, pName);
   }
   final MethodMatcher methodMatcher = createMethodMatcher(cut, pName, classesToMethods);
   List<ParameterAttributeName> reportedParams = null;
   if (!isAttsEnabled) {
     reportedParams = (List<ParameterAttributeName>) Lists.newArrayList();
   } else {
     reportedParams = getParameterAttributeNames(cut.getMethod());
   }
   return new ExtensionClassAndMethodMatcher(
       extension, cut, metricPrefix, classMatcher, methodMatcher, custom, reportedParams, type);
 }
 private static MethodMatcher createMethodMatcher(
     final Extension.Instrumentation.Pointcut cut,
     final String pExtName,
     final Map<String, MethodMapper> classesToMethods)
     throws XmlException {
   final List<Extension.Instrumentation.Pointcut.Method> methods = cut.getMethod();
   if (methods != null && !methods.isEmpty()) {
     return MethodMatcherUtility.createMethodMatcher(
         getClassName(cut), methods, classesToMethods, pExtName);
   }
   if (cut.getMethodAnnotation() != null) {
     return new AnnotationMethodMatcher(
         Type.getObjectType(cut.getMethodAnnotation().replace('.', '/')));
   }
   throw new XmlException(
       MessageFormat.format(
           "At least one method must be specified for each point cut in the extension {0}",
           pExtName));
 }