diff --git a/demo/demo/grid.cpp b/demo/demo/grid.cpp
index 53794f357897b5a674d55ce9f2a5bbe68575ebc9..9f373c5d12517cc50dcecd249a471b1e79a3de5b 100644
--- a/demo/demo/grid.cpp
+++ b/demo/demo/grid.cpp
@@ -112,10 +112,10 @@ namespace demo {
 		auto btnGrid = std::make_unique<fggl::gui::GridBox>(0, 2);
 
 		std::array<Action, 4> actions{{
-										  {"<", [=]() { this->rotate(true); }},
-										  {">", [=]() { this->rotate(false); }},
-										  {"^", [=]() { this->forward(); }},
-										  {"Z", [=]() {  } }
+										  {"<", [this]() { this->rotate(true); }},
+										  {">", [this]() { this->rotate(false); }},
+										  {"^", [this]() { this->forward(); }},
+										  {"Z", [this]() {  } }
 									  }};
 
 		fggl::math::vec2i pos{0, 0};
@@ -134,7 +134,7 @@ namespace demo {
 			fggl::math::vec2i size{64, 32};
 			auto btn = std::make_unique<fggl::gui::Button>(pos, size);
 			btn->label("go");
-			btn->addCallback([=](){
+			btn->addCallback([this](){
 				if ( !this->m_program.playing ) {
 					resetPuzzle();
 					this->m_program.m_currInstruction = 0;
@@ -148,7 +148,7 @@ namespace demo {
 			fggl::math::vec2i size{64, 64};
 			auto btn = std::make_unique<fggl::gui::Button>(pos, size);
 			btn->label("Del");
-			btn->addCallback([=](){
+			btn->addCallback([this](){
 				if ( !this->m_program.playing ) {
 					if ( !m_program.m_instructions.empty() ) {
 						m_program.m_instructions.pop_back();
@@ -292,19 +292,16 @@ namespace demo {
 			}
 
 			robotState.power--;
-			m_program.m_instructions[ m_program.m_currInstruction ].m_func();
-			m_program.m_currInstruction++;
+			m_program.step();
 		} else {
-			m_program.playing = false;
-			m_program.m_currInstruction = 0;
+			m_program.stop();
 			checkVictory();
 		}
 	}
 
 	void GridScene::resetPuzzle() {
 		// reset instruction panel
-		m_program.playing = false;
-		m_program.m_currInstruction = 0;
+		m_program.stop();
 
 		// reset robot state
 		auto& robotPos = m_grid->entities().get<CellPos>(m_player);
diff --git a/demo/demo/robot/programmer.cpp b/demo/demo/robot/programmer.cpp
index 6bdadcdbaf8749204ff3f5a194f01742ff53550f..5d3a1e5f727179fc9de1c23ab9f2fb6ad2f22eee 100644
--- a/demo/demo/robot/programmer.cpp
+++ b/demo/demo/robot/programmer.cpp
@@ -30,7 +30,7 @@ namespace demo::robot {
 		float trackHeight = m_tracks.size() * 32.0F;
 		std::size_t widestTrack = 0;
 		for ( auto& track : m_tracks ) {
-			widestTrack = std::max(widestTrack, track.get().m_instructions.size());
+			widestTrack = std::max(widestTrack, track.get().size());
 		}
 
 		float instructionWidth = 32 * widestTrack;
@@ -52,7 +52,7 @@ namespace demo::robot {
 		for ( auto track=0U; track < m_tracks.size(); ++track) {
 			auto& trackRef = m_tracks[track].get();
 
-			for (auto i = 0U; i < trackRef.m_instructions.size(); ++i) {
+			for (auto i = 0U; i < trackRef.size(); ++i) {
 				auto barCenter = this->topLeft();
 
 				barCenter.x += (i * (barExtents.x * 2) ) + barExtents.x;
diff --git a/demo/include/robot/programmer.hpp b/demo/include/robot/programmer.hpp
index 1025c182972176d46bf948ea48c0832a187e9af3..628dd9a00823bda8667162f9f8a00dd8efa64a06 100644
--- a/demo/include/robot/programmer.hpp
+++ b/demo/include/robot/programmer.hpp
@@ -34,6 +34,20 @@ namespace demo::robot {
 		std::vector<Instruction> m_instructions;
 		uint32_t m_currInstruction;
 		bool playing = false;
+
+		inline std::size_t size() {
+			return m_instructions.size();
+		}
+
+		inline void step() {
+			m_instructions[ m_currInstruction ].m_func();
+			m_currInstruction++;
+		}
+
+		inline void stop() {
+			playing = false;
+			m_currInstruction = 0;
+		}
 	};
 
 	class Timeline : public fggl::gui::Panel {