package me.eater.threedom.dom import me.eater.threedom.event.Event import me.eater.threedom.event.EventDispatcher import me.eater.threedom.utils.joml.Vector3d import org.joml.Vector3dc import kotlin.reflect.KClass interface IDocument : EventDispatcher, INodeContainer { fun > createNode(nodeType: KClass): T fun deleteNode(refNode: INode<*>) fun addEventListener(eventName: String, refNode: INode<*>, block: (Event) -> Unit) fun getNodeByNodeId(nodeId: Long): INode<*>? fun findAt(x: Number, y: Number, z: Number) = findAt(Vector3d(x, y, z)) fun findAt(vec: Vector3dc): Collection> fun rebalance() } inline fun > IDocument.createNode() = createNode(T::class)