Skip to content

c-g-dev/deco-hx

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 

Repository files navigation

deco-hx

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

}

About

Haxe decorator framework

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages