diff --git a/python-api-src/library.cpp b/python-api-src/library.cpp
index 3ea3049b0e53224197f3f591fb14bd49c5bce094..11857558e9db3c08b4028d1441d9d5a77eba7fea 100644
--- a/python-api-src/library.cpp
+++ b/python-api-src/library.cpp
@@ -23,8 +23,12 @@ PYBIND11_MODULE(library, m)
         .def(py::init());
 
     // IDABot is a specialization of Agent
-    py::class_<IDABot, sc2::Agent>(m, "IDABot")
-        .def(py::init());
+    py::class_<IDABot, PyIDABot, sc2::Agent>(m, "IDABot")
+        .def(py::init())
+        .def("OnGameStart", &IDABot::OnGameStart)
+        .def("OnStep", &IDABot::OnStep)
+        .def("OnStep_UpdateIDABot", &IDABot::OnStep_UpdateIDABot)
+        .def("GetMyUnits", &IDABot::GetMyUnits);
 
     py::class_<sc2::PlayerSetup>(m, "PlayerSetup");
 
diff --git a/python-api-src/library.h b/python-api-src/library.h
index 3720542c51ff3e197b45a530223d9320dac83d97..c8bdb794a34492ccfbd2f67a01eded7801d6e9db 100644
--- a/python-api-src/library.h
+++ b/python-api-src/library.h
@@ -19,5 +19,34 @@ public:
     }
 };
 
-// Defined
+class PyIDABot : public IDABot
+{
+public:
+    using IDABot::IDABot;
+    void OnGameStart() override
+    {
+        PYBIND11_OVERLOAD(
+            void,
+            IDABot,
+            OnGameStart
+        );
+    }
+    void OnStep() override
+    {
+        PYBIND11_OVERLOAD(
+            void,
+            IDABot,
+            OnStep
+        );
+    }
+    void OnStep_UpdateIDABot() override
+    {
+        PYBIND11_OVERLOAD(
+            void,
+            IDABot,
+            OnStep_UpdateIDABot
+        );
+    }
+};
+
 void define_typeenums(pybind11::module & m);
\ No newline at end of file
diff --git a/src/IDABot.h b/src/IDABot.h
index 090c96b7e97bfeb445b185018049bd7e0984b5b0..902134d9c209a35d59e5db33c4814a4aad0e00c3 100644
--- a/src/IDABot.h
+++ b/src/IDABot.h
@@ -36,7 +36,7 @@ public:
 
     void OnGameStart() override;
     void OnStep() override;
-	void OnStep_UpdateIDABot();
+	virtual void OnStep_UpdateIDABot();
 
     /*
         My stuff