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

package NamespaceA;

import java.nio.*;
import java.lang.*;
import java.util.*;
import com.google.flatbuffers.*;

public class TableInFirstNST {
  private NamespaceA.NamespaceB.TableInNestedNST fooTable;
  private byte fooEnum;
  private NamespaceA.NamespaceB.UnionInNestedNSUnion fooUnion;
  private NamespaceA.NamespaceB.StructInNestedNST fooStruct;

  public NamespaceA.NamespaceB.TableInNestedNST getFooTable() { return fooTable; }

  public void setFooTable(NamespaceA.NamespaceB.TableInNestedNST fooTable) { this.fooTable = fooTable; }

  public byte getFooEnum() { return fooEnum; }

  public void setFooEnum(byte fooEnum) { this.fooEnum = fooEnum; }

  public NamespaceA.NamespaceB.UnionInNestedNSUnion getFooUnion() { return fooUnion; }

  public void setFooUnion(NamespaceA.NamespaceB.UnionInNestedNSUnion fooUnion) { this.fooUnion = fooUnion; }

  public NamespaceA.NamespaceB.StructInNestedNST getFooStruct() { return fooStruct; }

  public void setFooStruct(NamespaceA.NamespaceB.StructInNestedNST fooStruct) { this.fooStruct = fooStruct; }


  public TableInFirstNST() {
    this.fooTable = null;
    this.fooEnum = 0;
    this.fooUnion = null;
    this.fooStruct = new NamespaceA.NamespaceB.StructInNestedNST();
  }
}

