diff --git a/CMakeLists.txt b/CMakeLists.txt
index 49718b894fe9cb950c24dab38cb048d49264bc53..f1687da0aeaffa907b459d4280e944b3d49392d9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -64,12 +64,15 @@ add_subdirectory( integrations/bullet )
 
 
 ## G++ enable insane checks
-target_compile_options( ${PROJECT_NAME} PRIVATE -Wall -fno-strict-aliasing -fno-strict-overflow )
+target_compile_options( ${PROJECT_NAME} PRIVATE -Wall -Wpedantic -Wextra -Wodr -fno-strict-aliasing -fno-strict-overflow )
+set_property(TARGET fggl PROPERTY INTERPROCEDURAL_OPTIMIZATION True)
 
 # extras
 #add_subdirectory(tests)
 if (FGGL_EXAMPLES)
   add_subdirectory(demo)
+  target_compile_options( demo PRIVATE -Wall -Wextra -Wodr -Wdouble-promotion -fno-strict-aliasing -fno-strict-overflow )
+  set_property(TARGET demo PROPERTY INTERPROCEDURAL_OPTIMIZATION True)
 endif()
 
 ##
diff --git a/build.sh b/build.sh
index 2bfd80461e0a3a4e2b118f284f08f0f3515fe674..11bce74690a255bf4391fe6e990474e1d461694b 100755
--- a/build.sh
+++ b/build.sh
@@ -20,7 +20,7 @@ rm -rf $CACHE
 #
 # build step
 #
-cmake -S . -B $BUILD_PATH -DCMAKE_BUILD_TYPE=debug
+cmake -S . -B $BUILD_PATH -DCMAKE_BUILD_TYPE=RelWithDebInfo
 cmake --build $BUILD_PATH
 cmake --install $BUILD_PATH --prefix /tmp/fggl-lib
 
diff --git a/demo/demo/main.cpp b/demo/demo/main.cpp
index 2783ab2fd9fb226744895002b4f2e2616df5bb5c..a09e849aa03e51d94e2fa8d96c05bc25c99c4a49 100644
--- a/demo/demo/main.cpp
+++ b/demo/demo/main.cpp
@@ -26,6 +26,7 @@
 #endif
 
 #include "fggl/fggl.hpp"
+#include "fggl/ecs/component_fwd.hpp"
 
 #include "fggl/audio/openal/audio.hpp"
 
diff --git a/fggl/app.cpp b/fggl/app.cpp
index 63f078ff14757e348ba71711c8e5b3a8b9d1d74a..5e70f94b0c014fb5305b12863eaf9121442af222 100644
--- a/fggl/app.cpp
+++ b/fggl/app.cpp
@@ -19,6 +19,7 @@
 
 #include <fggl/app.hpp>
 #include <fggl/ecs3/types.hpp>
+#include "fggl/ecs/component_fwd.hpp"
 #include "fggl/ecs3/module/module.hpp"
 #include <fggl/util/service.hpp>
 
diff --git a/include/fggl/ecs/component.hpp b/include/fggl/ecs/component.hpp
index 5ae0dfd9097a72eacd74fac90e8b8a0a18e6ae74..46c382c1950db935f87afd141065d2e5d86a6b6f 100644
--- a/include/fggl/ecs/component.hpp
+++ b/include/fggl/ecs/component.hpp
@@ -25,6 +25,8 @@
 #include <utility>
 #include <iostream>
 
+#include <typeinfo>
+
 #include <vector>
 #include <unordered_map>
 #include "yaml-cpp/yaml.h"
@@ -32,9 +34,7 @@
 namespace fggl::ecs {
 
 	template<typename T>
-	bool restore_config(T* comp, const YAML::Node& node) {
-		return false;
-	}
+	bool restore_config(T* comp, const YAML::Node& node);
 
 	class ComponentBase {
 		public:
@@ -84,7 +84,7 @@ namespace fggl::ecs {
 				C* ptr = new C();
 				bool restored = restore_config<C>(ptr, config);
 				if ( !restored ) {
-					debug::warning("error restoring {}", C::name);
+					debug::error("error restoring {}", C::name);
 					assert( false && "failed to restore configuration when loading type!" );
 				}
 				return ptr;
diff --git a/include/fggl/ecs/component_fwd.hpp b/include/fggl/ecs/component_fwd.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..22c1dafb5414abc6d348065be6040b4695391bf0
--- /dev/null
+++ b/include/fggl/ecs/component_fwd.hpp
@@ -0,0 +1,68 @@
+/*
+ * This file is part of FGGL.
+ *
+ * FGGL is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
+ * later version.
+ *
+ * FGGL is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along with FGGL.
+ * If not, see <https://www.gnu.org/licenses/>.
+ */
+
+//
+// Created by webpigeon on 22/07/22.
+//
+
+#ifndef FGGL_ECS_COMPONENT_FWD_HPP
+#define FGGL_ECS_COMPONENT_FWD_HPP
+
+#include "fggl/ecs/component.hpp"
+
+#include "fggl/math/types.hpp"
+#include "fggl/gfx/phong.hpp"
+#include "fggl/data/model.hpp"
+#include "fggl/phys/types.hpp"
+
+#ifdef __GNUC__
+	#include <cxxabi.h>
+#endif
+
+namespace fggl::ecs {
+
+	template<typename T>
+	bool restore_config(T* comp, const YAML::Node& node) {
+		char* realName;
+
+		#ifdef __GNUC__
+		int status;
+		realName = abi::__cxa_demangle(typeid(T).name(), 0, 0, &status);
+		#endif
+
+		debug::log(debug::Level::warning, "restore_config is not implemented for {}", realName);
+		return false;
+	}
+
+	template<>
+	bool restore_config(math::Transform* comp, const YAML::Node& node);
+
+	template<>
+	bool restore_config(gfx::PhongMaterial* comp, const YAML::Node& node);
+
+	template<>
+	bool restore_config(data::StaticMesh* meshComp, const YAML::Node& node);
+
+	template<>
+	bool restore_config(phys::RigidBody* body, const YAML::Node& node);
+
+	template<>
+	bool restore_config(phys::CollisionCallbacks* callbacks, const YAML::Node& node);
+
+	template<>
+	bool restore_config(phys::CollisionCache* cache, const YAML::Node& node);
+
+} // namespace fggl::ecs
+
+#endif //FGGL_ECS_COMPONENT_FWD_HPP
diff --git a/include/fggl/ecs3/prototype/loader.hpp b/include/fggl/ecs3/prototype/loader.hpp
index d9a72d8b956e32dbe8ec4ea4782536942390dcab..89fe334390cc0f9bed586a41907bc862126bf1ab 100644
--- a/include/fggl/ecs3/prototype/loader.hpp
+++ b/include/fggl/ecs3/prototype/loader.hpp
@@ -30,6 +30,7 @@
 #include "fggl/data/procedural.hpp"
 
 #include "fggl/ecs3/ecs.hpp"
+#include "fggl/ecs/component_fwd.hpp"
 
 namespace fggl::ecs3 {
 
@@ -128,23 +129,6 @@ namespace fggl::ecs {
 	constexpr const char* SHAPE_BOX_VALUE{"box"};
 
 	// scene template specialisations
-	template<>
-	bool restore_config(math::Transform* comp, const YAML::Node& node);
-
-	template<>
-	bool restore_config(gfx::PhongMaterial* comp, const YAML::Node& node);
-
-	template<>
-	bool restore_config(data::StaticMesh* meshComp, const YAML::Node& node);
-
-	template<>
-	bool restore_config(phys::RigidBody* body, const YAML::Node& node);
-
-	template<>
-	bool restore_config(phys::CollisionCallbacks* callbacks, const YAML::Node& node);
-
-	template<>
-	bool restore_config(phys::CollisionCache* cache, const YAML::Node& node);
 }
 
 #endif //FGGL_ECS3_PROTOTYPE_LOADER_HPP