namespace gaemstone.ECS; public abstract class EntityBase { public abstract World World { get; } public abstract TReturn Add(Identifier id); public abstract TReturn Remove(Identifier id); public abstract bool Has(Identifier id); public TReturn Add(string symbol) => Add(World.LookupSymbolOrThrow(symbol)); public TReturn Add() => Add(World.LookupOrThrow(typeof(T))); public TReturn Add(Entity relation, Entity target) => Add(Identifier.Pair(relation, target)); public TReturn Add(Entity target) => Add(World.LookupOrThrow(), target); public TReturn Add() => Add(World.LookupOrThrow(), World.LookupOrThrow()); public TReturn Remove(string symbol) => Remove(World.LookupSymbolOrThrow(symbol)); public TReturn Remove() => Remove(World.LookupOrThrow(typeof(T))); public TReturn Remove(Entity relation, Entity target) => Remove(Identifier.Pair(relation, target)); public TReturn Remove(Entity target) => Remove(World.LookupOrThrow(), target); public TReturn Remove() => Remove(World.LookupOrThrow(), World.LookupOrThrow()); public bool Has(string symbol) => Has(World.LookupSymbolOrThrow(symbol)); public bool Has() => Has(World.LookupOrThrow(typeof(T))); public bool Has(Entity relation, Entity target) => Has(Identifier.Pair(relation, target)); public bool Has(Entity target) => Has(World.LookupOrThrow(), target); public bool Has() => Has(World.LookupOrThrow(), World.LookupOrThrow()); public abstract T Get(Identifier id); public abstract T? GetOrNull(Identifier id) where T : unmanaged; public abstract T? GetOrNull(Identifier id, T _ = null!) where T : class; public abstract ref T GetMut(Identifier id) where T : unmanaged; public abstract ref T GetRefOrNull(Identifier id) where T : unmanaged; public abstract ref T GetRefOrThrow(Identifier id) where T : unmanaged; public abstract void Modified(Identifier id); public T Get() => Get(World.LookupOrThrow()); public T? GetOrNull() where T : unmanaged => GetOrNull(World.LookupOrThrow()); public T? GetOrNull(T _ = null!) where T : class => GetOrNull(World.LookupOrThrow()); public ref T GetMut() where T : unmanaged => ref GetMut(World.LookupOrThrow()); public ref T GetRefOrNull() where T : unmanaged => ref GetRefOrNull(World.LookupOrThrow()); public ref T GetRefOrThrow() where T : unmanaged => ref GetRefOrThrow(World.LookupOrThrow()); public void Modified() => Modified(World.LookupOrThrow()); public abstract TReturn Set(Identifier id, in T value) where T : unmanaged; public abstract TReturn Set(Identifier id, T obj) where T : class; public TReturn Set(in T value) where T : unmanaged => Set(World.LookupOrThrow(), value); public TReturn Set(T obj) where T : class => Set(World.LookupOrThrow(), obj); public TReturn ChildOf(Entity parent) => Add(World.ChildOf, parent); public TReturn ChildOf() => Add(World.ChildOf, World.LookupOrThrow()); public TReturn Disable() => Add(World.Disabled); public TReturn Enable() => Remove(World.Disabled); public bool IsDisabled => Has(World.Disabled); }