思いついたこと (3)

メタモデル記述をJavaで書いて解釈するってのが前回の主張ですが、GAE以外のケースでいくらかうまくいかないものを発見。
たとえば、HogeがFooを参照していて、それぞれのメタモデルがHogeMetaとFooMetaであるとすると、HogeMetaは次のように書かなきゃいけない。

public class HogeMeta {
    // FooはFooMetaからあとで生成されるので、いまは参照できない
    public static final Property<Foo> foo = ...;
}

そうすると、FooじゃなくてFooMetaを参照しないといけない。

public class HogeMeta {
    public static final Property<FooMeta> foo = ...;
}

もしくは遅延を掛けておく。

public class HogeMeta {
    public static final Property<?> foo = Property.modelOf(FooMeta.class, ...);
}

普通にモデルオブジェクトを作るくらいなら問題ないのですが、S2JDBCGenくらい高度なことやろうとすると問題としては大きい。単にHogeMeta/FooMetaを高階メタモデルとして、その次に一階メタモデルと実モデルを生成するという手はあるけどわざわざJavaメタモデルの宣言する利点が半減する(Validationの層をメタモデルでやりたかった)。

この時点では確かにFooがどのようなクラスになるか分かってないのでFooMetaしか参照できないのは仕方がないのだけど、非常にいまいちではある。
それならいっそProperty<Integer>とかProperty<String>の部分もJavaの型をそのまま使うんじゃなくてメタ型を使ってしまうのもいいのかな…

とりあえずこの問題は保留して、なんか作ってみるかな。