class ImmutablePrimaryKeyColumn extends ImmutableDocument implements PrimaryKeyColumn {

    private final String id;
    private final String name;
    private final int ordinalPosition;
    
    private final AtomicReference<ImmutableColumn> column;

    ImmutablePrimaryKeyColumn(ImmutableTable parent, Map<String, Object> pkc) {
        super(parent, pkc);
        final PrimaryKeyColumn prototype = new PrimaryKeyColumnImpl(parent, pkc);
        this.id              = prototype.getId();
        this.name            = prototype.getName();
        this.ordinalPosition = prototype.getOrdinalPosition();        
        this.column          = new AtomicReference<>();
    }

    @Override
    public Optional<Table> getParent() {
        return super.getParent().map(Table.class::cast);
    }

    @Override
    public String getId() {
        return id;
    }
    
    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getOrdinalPosition() {
        return ordinalPosition;
    }

    @Override
    public Optional<ImmutableColumn> findColumn() {<FILL_FUNCTION_BODY>}
    
    @Override
    public String toString() {
        return toStringHelper(this);
    } 
    
}

        if (column.get() == null) {
            column.set(PrimaryKeyColumn.super.findColumn().map(ImmutableColumn.class::cast).orElse(null));
        }
        return Optional.ofNullable(column.get());
    
<methods>public Stream<T> children(java.lang.String, BiFunction<P,Map<java.lang.String,java.lang.Object>,T>) ,public final Map<java.lang.String,java.lang.Object> getData() ,public final void put(java.lang.String, java.lang.Object) ,public java.lang.String toString() ,public static com.speedment.runtime.config.internal.immutable.ImmutableDocument wrap(com.speedment.runtime.config.Document) <variables>private final non-sealed Map<java.lang.String,List<com.speedment.runtime.config.Document>> children