1   package example;
2   
3   import spoon.processing.AbstractProcessor;
4   import spoon.reflect.code.CtBlock;
5   import spoon.reflect.code.CtExpression;
6   import spoon.reflect.declaration.CtClass;
7   import spoon.reflect.declaration.CtMethod;
8   import spoon.template.Substitution;
9   
10  public class CheckBeforeProcessor extends AbstractProcessor<CtMethod<?>> {
11  
12      public void process(CtMethod<?> m) {
13          CheckBefore annotation = m.getAnnotation(CheckBefore.class);
14          if (annotation == null) {
15              return;
16          }
17          for(String check : annotation.value()) {
18              CtExpression<Boolean> checkExpr = getFactory().Code().createCodeSnippetExpression(check);
19              CtBlock<?> checkBlock = Substitution.substituteMethodBody(
20                      (CtClass<?>) m.getDeclaringType(),
21                      new CheckBeforeTemplate(check, checkExpr),
22                      "check"
23              );
24              m.getBody().insertBegin(checkBlock);
25          }
26          //AnnotationHelper.removeAnnotation(m, CheckBefore.class);
27      }
28  
29  }