public override void Initialize()
        {
            base.Initialize();

            foreach (var system in AppDomain.CurrentDomain.GetAssemblies()
                     .SelectMany(a => a.GetTypes()
                                 .Where(t => t.GetCustomAttributes(true).Any(at => at.GetType() == typeof(ComponentSystemAttribute)))))
            {
                var obj = (ComponentSystem)Activator.CreateInstance(system);

                obj.Game = Game;

                var requiredComponents = new List <Type>();
                foreach (var attr in system.GetCustomAttributes(typeof(RequiredComponentsAttribute), true) as RequiredComponentsAttribute[])
                {
                    requiredComponents.AddRange(attr.RequiredComponents);
                }

                var contract = new ComponentSystemContract(obj, requiredComponents.ToArray());

                if (!_componentSystems.TryAdd(system, contract))
                {
                    throw new ArgumentException("A system with this type is already defined.");
                }
            }
        }
        public T RegisterSystem <T>() where T : ComponentSystem, new()
        {
            var type = typeof(T);
            var obj  = new T();

            obj.Game = Game;

            var requiredComponents = new List <Type>();

            foreach (var attr in typeof(T).GetCustomAttributes(typeof(RequiredComponentsAttribute), true) as RequiredComponentsAttribute[])
            {
                requiredComponents.AddRange(attr.RequiredComponents);
            }

            var contract = new ComponentSystemContract(obj, requiredComponents.ToArray());

            if (!_componentSystems.TryAdd(type, contract))
            {
                throw new ArgumentException("A system with this type is already defined.");
            }

            return(obj);
        }