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

package NamespaceA;

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

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();
  }
}
