@startuml
'https://plantuml.com/class-diagram

interface Vision{
    val parent: VisionGroup?
    fun getProperty(name,inherit,includeStyles,includeDefaults): Value?
}

interface Solid{
    The base for 3D geometry
}
Vision <-- Solid

class VisionGroup{
    A group of Visions

    val children: Map<NameToken, Vision>
    val defaultTarget: String

    fun content(target): Map<Name, Any>
    fun get(name: Name): Vision?
}
Vision <-- VisionGroup

class VisionBase{
    basic vision implementation
}
Vision <-- VisionBase


class SolidLabel
Solid <--- SolidLabel

class SolidGroup{
    var properties: MutableMeta?
    val children: Map<NameToken, Vision>
    var prototypes: MutableVisionGroup?

    fun getPrototype(name): Solid?
    fun prototypes(builder)
}
Solid <--- SolidGroup
VisionGroupBase <-- SolidGroup

class SphereLayer
Solid <-- SphereLayer

class Sphere
Solid <-- Sphere

class Box
Hexagon <-- Box

class GenericHexagon
Hexagon <-- GenericHexagon

class Extruded
Solid <-- Extruded


class PolyLine
Solid <--- PolyLine


interface Hexagon
Solid <-- Hexagon

class ConeSegment
Solid <-- ConeSegment

class ConeSurface
Solid <-- ConeSurface


class Convex
Solid <--- Convex

class Composite
Solid <--- Composite


interface SolidReference{
    val prototype: Solid
    fun getProperty(name,inherit,includeStyles,includeDefaults): Value?
}
VisionGroup <---- SolidReference
SolidReferenceGroup -- SolidReference

class SolidReferenceGroup{
    val refName: Name
    var properties: MutableMeta?
    val prototype: Solid
    val children: Map<NameToken, Vision>
    fun getProperty(name,inherit,includeStyles,includeDefaults): Value?
}
VisionBase <-- SolidReferenceGroup
VisionGroup <-- SolidReferenceGroup

interface MutableVisionGroup{
    fun onStructureChanged(owner, block)
    fun removeStructureListener(owner)
}
VisionGroup <---- MutableVisionGroup

class VisionGroupBase{
    val children: Map<NameToken, Vision>
    fun set(name: Name?, child: Vision?)
}
VisionBase <-- VisionGroupBase
MutableVisionGroup <-- VisionGroupBase

class RootVisionGroup
VisionGroupBase <-- RootVisionGroup

class VisionOfPlotly{
     var properties: MutableMeta?
     val plot: Plot
}
VisionBase <-- VisionOfPlotly

class VisionOfMarkup{
    val format: String
    var content: String?
}
VisionBase <-- VisionOfMarkup
@enduml