上記のmixinとVariable型使って、実行時にデータベースからスキーマとってきてメソッドを追加してしまえばActiveRecordが実現できるわけですが、それをコンパイル時にやってやると素敵なのかな。
つまり
module ActiveRecord{ compile{ Listlist = database.getFields(getClass().getName()); for(Field f : list){ String name = f.getName(); addField(Variable.class, name); addMethod("set" + f.getName(), { x : setField(name, x)}); } } void add(){ database.add(this); } void remove(){ database.remove(this); } }
みたいなことを書いておけば、コンパイル前にメソッドが適当に追加される。
class ShohinTable mixin ActiveRecord{ }
ってやったときにフィールド名に対応する「静的な」メンバーができあがるって寸法さ!
すげ〜怖い。