Plug-and-play Haxe decorator framework.
Add init macro:
--macro hx.decorators.Init.run({ decoratorPackages:["app.decorators"], targetPackagePattern:"" })
Then you can drop decorators into app.decorators module with no further required integration.
Example decorator:
//decorator that makes a field have (default, null) access
@:decorator("guard")
class Guard extends Decorator {
#if macro
//decorator must contain this block
public static macro function build(d: Expr):Array<Field> {
return Decorator.apply(d);
}
function transform(f:Array<Field>):Array<Field> {
try {
var cls = Context.getLocalClass().get();
var fields = Context.getBuildFields();
if (!Util.anyFieldHasMeta(fields, "guard")) {
return fields;
}
var out = new Array<Field>();
for (f in fields) {
if (Util.fieldHasMeta(f, "guard")) {
switch (f.kind) {
case FVar(_, _):
Util.consumeFieldMeta(f, "guard");
var acc = Util.ensurePublicAccess(f.access);
var nf = Util.varToReadonlyProp(f);
nf.access = acc;
out.push(nf);
case FProp(_, _, _, _):
Context.error("@guard can only be used on simple vars (e.g. `var x:T;`).", f.pos);
out.push(f);
case FFun(_):
Context.error("@guard is not valid on methods.", f.pos);
out.push(f);
}
} else {
out.push(f);
}
}
return out;
}
catch(e) {
return Context.getBuildFields();
}
}
#end
}