@startuml

interface Graph {
    {abstract}id: UUID
    {abstract}nodes: ListBuffer[Vertex]
}

Graph *-->Vertex

interface Vertex {
    {abstract}id: Int
    {abstract}graph: Graph
    {abstract}schema: Schema
    +caption: String
    +description: String
    +inPort: VertexPort
    +outPort: VertexPort
    {abstract}inPorts: ListBuffer[VertexPort]
    {abstract}outPorts: ListBuffer[VertexPort]
    +inputSchema: Schema
    +inputSchemas(index: Int): Schema
    +outputSchema: Schema
    +outputSchemas(index: Int): Schema
    +isValid: Boolean
    {abstract}validate(): Boolean
}

Vertex *--> VertexPort
Vertex --> PortListExtension

interface VertexPort {
    {abstract}id: Int
    {abstract}schema: Schema
    {abstract}link: Edge
    {abstract}links: ListBuffer[Edge]
}

VertexPort *--> Edge

interface Edge {
    {abstract}from: VertexPort
    {abstract}to: VertexPort
}

class PortListExtension <<implicit class>>\n<<ListBuffer[VertexPort]>> {
    +isValid: Boolean
    +fromSchema(index: Int): Schema
    +schema(index: Int): Schema
}

@enduml