#pragma once namespace lt::app { class ISystem; extern Scope create_application(); /** The main application class. * Think of this like an aggregate of systems, you register systems through this interface. * Then they'll tick every "application frame". */ class Application { public: Application(const Application &) = delete; Application(Application &&) = delete; auto operator=(const Application &) -> Application & = delete; auto operator=(Application &&) -> Application & = delete; virtual ~Application() = default; void game_loop(); void register_system(Ref system); void unregister_system(Ref system); protected: Application() = default; private: std::vector> m_systems; std::vector> m_systems_to_be_removed; }; } // namespace lt::app