package net.ranides.assira.grammar;

import net.ranides.assira.collection.query.CQuery;
import net.ranides.assira.generic.Ref;
import net.ranides.assira.grammar.properties.G4NodeProperty;
import net.ranides.assira.reflection.IClass;

public interface G4Node {

    Object unwrap();

    IClass<?> type();

    String name();

    String shortname();

    String qualifier();

    G4Node root();

    Ref<G4Node> parent();

    Ref<G4Node> parent(int levels);

    CQuery<G4Node> parents();

    CQuery<G4Node> children();

    CQuery<G4Node> children(String name);

    G4Node child(int index);

    G4Node child(String name);

    CQuery<G4Node> findAll(String path);

    G4Node find(String path);

    String path();

    String pathComponent();

    String text();

    boolean has(G4NodeProperty<?> key);

    boolean has(G4NodeProperty<?> key, Object value);

    <V> Ref<V> get(G4NodeProperty<V> key);

}
