-こんな感じ

テンプレートでひとつひとつ機能を作っていく。。。Velocityテンプレートで書くのが難しいロジックは、バッキングBeanで細工していく、そんなステップです。

  @ThrowableHandler
  public Class<?> dumpException(Exception e, CalcModel model) throws Throwable {
    System.out.println("result: " + model.getResult());
    e.printStackTrace(System.err);
    throw e;
  }  

こんなの(一部)を、以下のテンプレート(一部)でジェネレート。

  public Object handleThrowable(ApplicationAdaptor application,
      Throwable t) throws Throwable {
#foreach($throwableHandler in ${inspector.throwableHandlers})
    if(t instanceof ${throwableHandler.throwableParameter.qualifiedName}) {
#foreach($param in ${throwableHandler.parameters})
#if(${param.throwable} == false)
#if(${param.packageName} == ${inspector.userType.packageName})
        ${param.shortName} ${param.parameterName} =
          application.getComponent(this, ${param.shortName}.class);
#else
        ${param.qualifiedName} ${param.parameterName} = 
          application.getComponent(this, ${param.qualifiedName}.class);
#end
#end
#end
      return ${throwableHandler.callSignature};
    }
#end
    throw t;
  }

元を継承してできるクラスの、該当箇所に関わる結果は、

  public Object handleThrowable(ApplicationAdaptor application,
      Throwable t) throws Throwable {
    if(t instanceof Exception) {
      CalcModel model =
        application.getComponent(this, CalcModel.class);
      return dumpException((Exception)t, model);
    }
    throw t;
  }

ちょっと自然なJavaコードではないですね。スパイラルに作りこんでいずれは美しくジェネレートしたいと思っています。