@Override
  public void process(Element element, EComponentHolder holder) throws Exception {
    ExecutableElement executableElement = (ExecutableElement) element;
    JMethod delegatingMethod = codeModelHelper.overrideAnnotatedMethod(executableElement, holder);
    JBlock previousBody = codeModelHelper.removeBody(delegatingMethod);
    JDefinedClass anonymousRunnableClass =
        codeModelHelper.createDelegatingAnonymousRunnableClass(holder, previousBody);

    UiThread annotation = element.getAnnotation(UiThread.class);
    long delay = annotation.delay();
    UiThread.Propagation propagation = annotation.propagation();

    if (delay == 0) {
      if (propagation == UiThread.Propagation.REUSE) {
        // Put in the check for the UI thread.
        addUIThreadCheck(delegatingMethod, previousBody, holder);
      }

      delegatingMethod.body().invoke(holder.getHandler(), "post").arg(_new(anonymousRunnableClass));
    } else {
      delegatingMethod
          .body()
          .invoke(holder.getHandler(), "postDelayed")
          .arg(_new(anonymousRunnableClass))
          .arg(lit(delay));
    }
  }