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