// automatically generated by the FlatBuffers compiler, do not modify

package MyGame.Example;

import com.google.flatbuffers.FlatBufferBuilder;

public class AnyUniqueAliasesUnion {
  private byte type;
  private Object value;

  public byte getType() { return type; }

  public void setType(byte type) { this.type = type; }

  public Object getValue() { return value; }

  public void setValue(Object value) { this.value = value; }

  public AnyUniqueAliasesUnion() {
    this.type = AnyUniqueAliases.NONE;
    this.value = null;
  }

  public MyGame.Example.MonsterT asM() { return (MyGame.Example.MonsterT) value; }
  MyGame.Example.TestSimpleTableWithEnumT asTS() { return (MyGame.Example.TestSimpleTableWithEnumT) value; }
  public MyGame.Example2.MonsterT asM2() { return (MyGame.Example2.MonsterT) value; }

  public static int pack(FlatBufferBuilder builder, AnyUniqueAliasesUnion _o) {
    switch (_o.type) {
      case AnyUniqueAliases.M: return MyGame.Example.Monster.pack(builder, _o.asM());
      case AnyUniqueAliases.TS: return MyGame.Example.TestSimpleTableWithEnum.pack(builder, _o.asTS());
      case AnyUniqueAliases.M2: return MyGame.Example2.Monster.pack(builder, _o.asM2());
      default: return 0;
    }
  }
}

