+#include "presenter.h"
+#include <functional>
+#include <msp/game/events.h>
+#include <msp/game/stage.h>
+#include "renderer.h"
+
+using namespace std;
+
+namespace Msp::GameView {
+
+Presenter::Presenter(Game::Director &d, GL::View &v):
+ director(d),
+ gl_view(v),
+ resources(director.get_resources()),
+ event_observer(director.get_event_bus())
+{
+ event_observer.observe<Game::Events::StageActivated>([this](auto &e){ stage_activated(e); });
+
+ if(Game::Stage *active_stage = director.get_active_stage())
+ stage_activated({ *active_stage });
+}
+
+Presenter::~Presenter()
+{
+ for(Renderer *r: renderers)
+ r->get_stage().remove_system(*r);
+}
+
+void Presenter::stage_activated(const Game::Events::StageActivated &event)
+{
+ if(!event.stage.get_system<Renderer>())
+ renderers.push_back(&event.stage.add_system<Renderer>(ref(gl_view)));
+}
+
+} // namespace Msp::GameView