using Syntriax.Engine.Core.Abstract; using Syntriax.Engine.Core.Exceptions; namespace Syntriax.Engine.Core.Factory; public class UniverseObjectFactory { public static IUniverseObject Instantiate() => Instantiate(); public static T Instantiate(params object?[]? args) where T : class, IUniverseObject => Instantiate(behaviourController: null, stateEnable: null, args); public static IUniverseObject Instantiate(IBehaviourController? behaviourController = null, IStateEnable? stateEnable = null) => Instantiate(behaviourController, stateEnable); public static T Instantiate( IBehaviourController? behaviourController = null, IStateEnable? stateEnable = null, params object?[]? args ) where T : class, IUniverseObject { T universeObject = TypeFactory.Get(args); behaviourController ??= TypeFactory.Get(); stateEnable ??= TypeFactory.Get(); if (!behaviourController.Assign(universeObject)) throw AssignFailedException.From(behaviourController, universeObject); if (!stateEnable.Assign(universeObject)) throw AssignFailedException.From(stateEnable, universeObject); if (!universeObject.Assign(behaviourController)) throw AssignFailedException.From(universeObject, behaviourController); if (!universeObject.Assign(stateEnable)) throw AssignFailedException.From(universeObject, stateEnable); return universeObject; } }