diff --git a/README.md b/README.md
index 972c01d3466c2ad35e9bb86ad02b7363b71cca00..405a5d4fd1cb0111358ccdc0d661d127b274e126 100644
--- a/README.md
+++ b/README.md
@@ -19,4 +19,7 @@ cmake --build ./build
 Release Mode :
 ```shell
 cmake --build ./build --config Release
-```
\ No newline at end of file
+```
+
+## Source 
+Type Erasure Inspiration : [Type Erasure - CppCon 2021 - Klaus Iglberger](https://www.youtube.com/watch?v=4eeESJQk-mw&ab_channel=CppCon)
\ No newline at end of file
diff --git a/source/engine/graphics/front/module/ImageModule.hpp b/old2/FrameBufferModule.hpp
similarity index 60%
rename from source/engine/graphics/front/module/ImageModule.hpp
rename to old2/FrameBufferModule.hpp
index ee339bda17d73e3b763f50aa88a0d81e9f97e728..cc90570ad2107ef02bad1441c49d0d3e8c53540e 100644
--- a/source/engine/graphics/front/module/ImageModule.hpp
+++ b/old2/FrameBufferModule.hpp
@@ -1,5 +1,7 @@
 #pragma once
 
+#include <any>
+
 #include <engine/graphics/back/buffers/VertexArray.hpp>
 #include <engine/graphics/back/buffers/VerticeBuffer.hpp>
 #include <engine/graphics/back/shaders/Program.hpp>
@@ -8,12 +10,12 @@
 #include <engine/graphics/utility/module.hpp>
 
 namespace megu {
-    class Image_Module : public Module<Image> {
-        public:
-            Image_Module();
-           ~Image_Module() = default;
+    class FrameBuffer_Module : public Module<std::any> {
+       public:
+            FrameBuffer_Module();
+           ~FrameBuffer_Module() = default;
 
-            void render(const Window &, const Camera &, Image &, const TextureArray &) override;
+            void render(const Window &, const Camera &, std::any &, const TextureArray &) override;
 
         private:
             VertexArray _vao;
diff --git a/old2/ImageModule.cpp b/old2/ImageModule.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f56a235cd0a48b19e32184936a9d560398a9b6a3
--- /dev/null
+++ b/old2/ImageModule.cpp
@@ -0,0 +1,26 @@
+#include "ImageModule.hpp"
+
+#include <engine/graphics/front/object/Image.hpp>
+#include <engine/graphics/utility/array_generator.hpp>
+
+namespace megu {
+    ImageModule::ImageModule()
+    : _vbo(this->_vao, Quads::Layout(), Quads::Vertices().size(), megu::EditMode::STATIC) {
+        Source vert("assets/shaders/Image-Instanced-Fat.vert", Source::Categorie::VERTEX);
+        this->_program.attach(vert);
+
+        Source frag("assets/shaders/Texture-Fat.frag", Source::Categorie::FRAGMENT);
+        this->_program.attach(frag);
+
+        this->_program.link();
+
+        this->_vbo << Quads::Vertices();
+
+        vert.release();
+        frag.release();
+    }
+
+    void ImageModule::render(Image & image) {
+        std::cout << "Image !" << std::endl;
+    }
+}
\ No newline at end of file
diff --git a/old2/ImageModule.hpp b/old2/ImageModule.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..7f7adbc2b7c15d401149bfaa45eb3cda818806e1
--- /dev/null
+++ b/old2/ImageModule.hpp
@@ -0,0 +1,22 @@
+#pragma once
+
+#include "QuadGraphicModule.hpp"
+
+#include <engine/graphics/back/buffers/VertexArray.hpp>
+#include <engine/graphics/back/buffers/VerticeBuffer.hpp>
+#include <engine/graphics/back/shaders/Program.hpp>
+
+namespace megu {
+    class ImageModule : public virtual QuadGraphicModule {
+        public:
+            ImageModule();
+           ~ImageModule() = default;
+
+            virtual void render(Image &) override;
+
+        private:
+            VertexArray _vao;
+            VerticeBuffer _vbo;
+            Program _program;
+    };
+}
\ No newline at end of file
diff --git a/old2/SpriteModule.cpp b/old2/SpriteModule.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..70651e7d88715e438b6dcc19816dbc7d0c737c72
--- /dev/null
+++ b/old2/SpriteModule.cpp
@@ -0,0 +1,16 @@
+#include "SpriteModule.hpp"
+
+#include <engine/graphics/utility/array_generator.hpp>
+#include <engine/graphics/front/object/Sprite.hpp>
+
+#include <iostream>
+
+namespace megu {
+    SpriteModule::SpriteModule() {
+       
+    }
+
+    void SpriteModule::render(Sprite & sprite) {
+        std::cout << "Sprite !" << std::endl;
+    }
+}
\ No newline at end of file
diff --git a/old2/SpriteModule.hpp b/old2/SpriteModule.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..383f0c8c5bb63a4db2b1f65bd9812be3774b54e3
--- /dev/null
+++ b/old2/SpriteModule.hpp
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "QuadGraphicModule.hpp"
+
+#include <engine/graphics/back/buffers/VertexArray.hpp>
+#include <engine/graphics/back/buffers/VerticeBuffer.hpp>
+#include <engine/graphics/back/shaders/Program.hpp>
+
+namespace megu {
+    class SpriteModule : public virtual QuadGraphicModule {
+        public:
+            SpriteModule();
+           ~SpriteModule() = default;
+
+           virtual void render(Sprite &) override;
+    };
+}
\ No newline at end of file
diff --git a/source/engine/graphics/front/engine/Engine.cpp b/source/engine/graphics/front/engine/Engine.cpp
index 1984061774f43a1069d8da06c8d834d865f0e36c..1cf053196cce5bc5d46cc11608fc1e0ff3773df5 100644
--- a/source/engine/graphics/front/engine/Engine.cpp
+++ b/source/engine/graphics/front/engine/Engine.cpp
@@ -17,9 +17,9 @@ namespace megu {
         this->_layers[priority] = std::make_unique<Layer>(renderer);
     }
 
-    void GraphicEngine::push(Priority layer_priority, Priority object_priority, Renderable & object) {
-        this->_layers[layer_priority].get()->push(object_priority, object);
-    }
+    //void GraphicEngine::push(Priority layer_priority, Priority object_priority, GraphicObject & object) {
+    //    this->_layers[layer_priority].get()->push(object_priority, object);
+    //}
 
     void GraphicEngine::remove(Priority priority) {
         auto it = this->_layers.find(priority);
@@ -51,7 +51,7 @@ namespace megu {
             glViewport(0, 0, static_cast<GLsizei>(this->_window.width()), static_cast<GLsizei>(this->_window.height()));
             glClear(GL_COLOR_BUFFER_BIT);
             std::any any = 1;
-            this->_module.render(this->_window, this->_view, any, textures);
+            this->_module.render(textures);
             this->_window.swapBuffers();
         }
     }
diff --git a/source/engine/graphics/front/engine/Engine.hpp b/source/engine/graphics/front/engine/Engine.hpp
index b9525b45fc0a50808b861fb455fdc63c3c97bdc8..dc41a4f7fb77bf830e16076ec326e432cbc95376 100644
--- a/source/engine/graphics/front/engine/Engine.hpp
+++ b/source/engine/graphics/front/engine/Engine.hpp
@@ -17,7 +17,11 @@ namespace megu {
            ~GraphicEngine() = default;
 
             void push(Priority, Renderer &);
-            void push(Priority, Priority, Renderable &);
+
+            template <class T>
+            void push(Priority layer_priority, Priority object_priority, T & object) {
+                this->_layers[layer_priority].get()->push<T>(object_priority, object);
+            }
 
             void remove(Priority);
 
@@ -31,7 +35,7 @@ namespace megu {
 
         private:
             std::map<Priority, std::unique_ptr<Layer>> _layers;
-            FrameBuffer_Module _module;
+            FrameBufferModule _module;
             Window & _window;
             View _view;
 
diff --git a/source/engine/graphics/front/engine/Layer.cpp b/source/engine/graphics/front/engine/Layer.cpp
index 70130adf418fd169a4768796474d41caad3f46e6..f65c6c3beefde6cc8d26bb4e6a595385cba7f562 100644
--- a/source/engine/graphics/front/engine/Layer.cpp
+++ b/source/engine/graphics/front/engine/Layer.cpp
@@ -5,8 +5,4 @@
 namespace megu {
     Layer::Layer(Renderer & renderer) 
     : _renderer(renderer), _frameBuffer(static_cast<GLuint>(renderer.dimension().x), static_cast<GLuint>(renderer.dimension().y)) {}
-
-    void Layer::push(Priority priority, Renderable & object) {
-        this->_objects[typeid(object)].insert(object);
-    }
 }
\ No newline at end of file
diff --git a/source/engine/graphics/front/engine/Layer.hpp b/source/engine/graphics/front/engine/Layer.hpp
index a81e881bfe9f18f983adb029405e9ce26a24f87e..325b14430df24582fcad295b3435b70a00851e55 100644
--- a/source/engine/graphics/front/engine/Layer.hpp
+++ b/source/engine/graphics/front/engine/Layer.hpp
@@ -9,6 +9,9 @@
 #include <engine/graphics/front/object/Renderable.hpp>
 #include <engine/graphics/utility/reference_sorter.hpp>
 
+#include <engine/graphics/front/object/Renderable.hpp>
+#include <engine/graphics/front/module/QuadGraphicModule.hpp>
+
 #include "Priority.hpp" 
 #include "Renderer.hpp"
 
@@ -22,15 +25,15 @@ namespace megu {
             
             inline const Renderer & renderer() const {return this->_renderer;}
 
-            void push(Priority, Renderable &);
+            template <class T>
+            void push(Priority priority, T & object) {
+                this->_objects.insert({priority, Renderable(object, this->_module)});
+            }
 
             const Texture & draw(const Window & w, const TextureArray & a) {
                 this->_frameBuffer.bind();
-                for(const auto & [type, objects] : this->_objects) {
-                    if(!objects.empty()) {
-                        //std::cout << typeid((*objects.begin()).get()).name() << std::endl;
-                        this->_renderer.render(w, (*objects.begin()).get(), a);
-                    }
+                for(auto & [type, object] : this->_objects) {
+                    this->_renderer.render(w, object, a);
                 }
                
                 return this->_frameBuffer.texture();
@@ -39,6 +42,7 @@ namespace megu {
         private:
             Renderer & _renderer;
             FrameBuffer _frameBuffer;
-            std::map<std::type_index, std::set<std::reference_wrapper<Renderable>>> _objects;
+            QuadGraphicModule _module;
+            std::map<Priority, Renderable> _objects;
     };
 }
\ No newline at end of file
diff --git a/source/engine/graphics/front/engine/Renderer.hpp b/source/engine/graphics/front/engine/Renderer.hpp
index 3115f095a71ef68d75d75c15508a66c5812de351..c366b7993e0f68c4640369261604e76c3ecb5d45 100644
--- a/source/engine/graphics/front/engine/Renderer.hpp
+++ b/source/engine/graphics/front/engine/Renderer.hpp
@@ -6,7 +6,11 @@
 #include <engine/graphics/back/buffers/FrameBuffer.hpp>
 #include <engine/graphics/back/cameras/View.hpp>
 
-#include <engine/graphics/front/module/ImageModule.hpp>
+#include <engine/io/Window.hpp>
+#include <engine/graphics/front/object/Renderable.hpp>
+#include <engine/graphics/front/engine/TextureArray.hpp>
+
+#include <engine/graphics/front/object/Renderable.hpp>
 
 namespace megu {
     class Renderer {
@@ -17,7 +21,7 @@ namespace megu {
             
             void render(const Window & w, Renderable & r, const TextureArray & a) {
                 this->clear();
-                r.accept(w, this->_view, this->_module, a);
+                render_ext(r, w, this->_view, a);
             }
 
             const glm::vec2 dimension() const {return this->_view.dimension();}
@@ -29,6 +33,5 @@ namespace megu {
 
         private:
             View _view;
-            Image_Module _module;
     };
 }
\ No newline at end of file
diff --git a/source/engine/graphics/front/module/FrameBufferModule.cpp b/source/engine/graphics/front/module/FrameBufferModule.cpp
index 8da4da83ec74d547b6c91f7863170f3af31e65c2..7f4e5a61f8dc8070d86ff4406df7cc4a970db1b5 100644
--- a/source/engine/graphics/front/module/FrameBufferModule.cpp
+++ b/source/engine/graphics/front/module/FrameBufferModule.cpp
@@ -4,7 +4,7 @@
 #include <engine/graphics/utility/array_generator.hpp>
 
 namespace megu {
-    FrameBuffer_Module::FrameBuffer_Module()
+    FrameBufferModule::FrameBufferModule()
     : _vbo(this->_vao, Plane::Layout(), Plane::Vertices(), megu::EditMode::STATIC) {
         megu::Source vert("assets/shaders/FrameBuffer-Instanced.vert", Source::Categorie::VERTEX);
         this->_program.attach(vert);
@@ -18,7 +18,7 @@ namespace megu {
         frag.release();
     }
 
-    void FrameBuffer_Module::render(const Window & window, const Camera & camera, std::any & any, const TextureArray & textures) {
+    void FrameBufferModule::render(const TextureArray & textures) {
         this->_program.use();
         this->_vao.bind();
 
diff --git a/source/engine/graphics/front/module/FrameBufferModule.hpp b/source/engine/graphics/front/module/FrameBufferModule.hpp
index cc90570ad2107ef02bad1441c49d0d3e8c53540e..2355abbbb81a62d41925d9d862950ce11f5f2be7 100644
--- a/source/engine/graphics/front/module/FrameBufferModule.hpp
+++ b/source/engine/graphics/front/module/FrameBufferModule.hpp
@@ -7,15 +7,16 @@
 #include <engine/graphics/back/shaders/Program.hpp>
 
 #include <engine/graphics/front/object/Image.hpp>
-#include <engine/graphics/utility/module.hpp>
+
+#include "Module.hpp"
 
 namespace megu {
-    class FrameBuffer_Module : public Module<std::any> {
+    class FrameBufferModule {
        public:
-            FrameBuffer_Module();
-           ~FrameBuffer_Module() = default;
+            FrameBufferModule();
+           ~FrameBufferModule() = default;
 
-            void render(const Window &, const Camera &, std::any &, const TextureArray &) override;
+            void render(const TextureArray &);
 
         private:
             VertexArray _vao;
diff --git a/source/engine/graphics/front/module/ImageModule.cpp b/source/engine/graphics/front/module/ImageModule.cpp
deleted file mode 100644
index c945ac21285718628d0e9eddcabf5e8f8c9e6f41..0000000000000000000000000000000000000000
--- a/source/engine/graphics/front/module/ImageModule.cpp
+++ /dev/null
@@ -1,44 +0,0 @@
-#include "ImageModule.hpp"
-
-#include <engine/graphics/utility/array_generator.hpp>
-
-namespace megu {
-    Image_Module::Image_Module()
-    : _vbo(this->_vao, Quads::Layout(), Quads::Vertices().size(), megu::EditMode::STATIC) {
-        Source vert("assets/shaders/Image-Instanced-Fat.vert", Source::Categorie::VERTEX);
-        this->_program.attach(vert);
-
-        Source frag("assets/shaders/Texture-Fat.frag", Source::Categorie::FRAGMENT);
-        this->_program.attach(frag);
-
-        this->_program.link();
-
-        this->_vbo << Quads::Vertices();
-
-        vert.release();
-        frag.release();
-    }
-
-    void Image_Module::render(const Window &, const Camera & camera, Image & image, const TextureArray &) {
-        this->_vao.bind();
-        this->_program.use();
-        image.texture().bind();
-
-        this->_program.setUniform("uProj", camera.projection());
-        this->_program.setUniform("uView", camera.view());
-
-        static auto uSampler = array_generator<GLint, 32>().array;
-        this->_program.setUniform("uSampler", uSampler);
-
-        std::vector<glm::mat4> uModels;
-        std::vector<GLint> uTextures;
-
-        uModels.push_back(image.transformation().model());
-        uTextures.push_back(0);
-
-        this->_program.setUniform("uModel", uModels);
-        this->_program.setUniform("uTextures", uTextures);
-
-        glDrawArraysInstanced(Quads::Primitive(), 0, static_cast<GLsizei>(this->_vbo.size()), 1);
-    }
-}
\ No newline at end of file
diff --git a/source/engine/graphics/front/module/Module.hpp b/source/engine/graphics/front/module/Module.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..99269edf9227923cde4e72da5541e4c16dfd0ae0
--- /dev/null
+++ b/source/engine/graphics/front/module/Module.hpp
@@ -0,0 +1,26 @@
+#pragma once
+
+#include <engine/graphics/back/cameras/Camera.hpp>
+#include <engine/graphics/front/engine/TextureArray.hpp>
+#include <engine/graphics/utility/reference_sorter.hpp>
+#include <engine/io/Window.hpp>
+
+namespace megu {
+    template <class T>
+    class Module {
+        public:
+            virtual void draw(T &, const Window &, const Camera &, const TextureArray &) const = 0;
+    };
+
+    template <class ... Ts>
+    class Multy_Module : public Module<Ts> ... {};
+
+    template <class T>
+    using ref_set = std::set<std::reference_wrapper<T>, reference_sorter<T>>;
+
+    template <class T>
+    using Module_Array = Module<ref_set<T>>;
+
+    template <class ... Ts>
+    class Multy_Module_Array : public Module_Array<Ts> ... {};
+}
\ No newline at end of file
diff --git a/source/engine/graphics/front/module/QuadGraphicModule.cpp b/source/engine/graphics/front/module/QuadGraphicModule.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..71357193b47f21a94155f19ed3ac4fcfe5584568
--- /dev/null
+++ b/source/engine/graphics/front/module/QuadGraphicModule.cpp
@@ -0,0 +1,16 @@
+#include "QuadGraphicModule.hpp"
+
+#include <engine/graphics/front/object/Image.hpp>
+#include <engine/graphics/front/object/Sprite.hpp>
+
+#include <iostream>
+
+namespace megu {
+    void QuadGraphicModule::draw(Image &, const Window &, const Camera &, const TextureArray &) const {
+        std::cout << "Image !" << std::endl;
+    }
+
+    void QuadGraphicModule::draw(Sprite &, const Window &, const Camera &, const TextureArray &) const {
+        std::cout << "Sprite !" << std::endl;
+    }
+}
\ No newline at end of file
diff --git a/source/engine/graphics/front/module/QuadGraphicModule.hpp b/source/engine/graphics/front/module/QuadGraphicModule.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..972c2adf7b89e06f67b5979cc68526c9fd6ac13b
--- /dev/null
+++ b/source/engine/graphics/front/module/QuadGraphicModule.hpp
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "Module.hpp"
+
+
+
+namespace megu {
+    class Image;
+    class Sprite;
+
+    class QuadGraphicModule : public Module<Image>, public Module<Sprite> {
+        public:
+            void draw(Image &, const Window &, const Camera &, const TextureArray &) const override;
+            void draw(Sprite &, const Window &, const Camera &, const TextureArray &) const override;
+    };
+}
\ No newline at end of file
diff --git a/source/engine/graphics/front/object/Image.hpp b/source/engine/graphics/front/object/Image.hpp
index b92f031cb96fbec7c7cd269c770c8965b20be9e0..f6bd8d5c1a147fd31d4f95a93261cd3c605a743e 100644
--- a/source/engine/graphics/front/object/Image.hpp
+++ b/source/engine/graphics/front/object/Image.hpp
@@ -1,18 +1,15 @@
 #pragma once
 
-#include "Renderable.hpp"
-
 #include <filesystem>
 #include <glm/vec2.hpp>
 
 #include <engine/graphics/back/geometry/Transformable.hpp>
 #include <engine/graphics/back/textures/Texture.hpp> 
-
 #include <engine/graphics/front/geometry/Quads.hpp>
 #include <engine/graphics/utility/type.hpp>
 
 namespace megu {
-    class Image : public Renderable {
+    class Image {
         public:
             Image() = default;
             Image(const std::filesystem::path &);
@@ -45,7 +42,7 @@ namespace megu {
             void load(const std::filesystem::path &, bool = false);
             void load(const TextureBuffer &);
             void link(const Texture &);
-            
+
         private:
             Texture _texture;
             Quads _geometry;
diff --git a/source/engine/graphics/front/object/Renderable.hpp b/source/engine/graphics/front/object/Renderable.hpp
index 441a0789a871aafffa935a538bcf40a173ecfa27..d70a3caf08d781d50998bf247d1eb50df58d5464 100644
--- a/source/engine/graphics/front/object/Renderable.hpp
+++ b/source/engine/graphics/front/object/Renderable.hpp
@@ -1,15 +1,61 @@
 #pragma once
 
-#include <engine/io/Window.hpp>
-#include <engine/graphics/utility/module.hpp>
-#include <engine/graphics/front/engine/TextureArray.hpp>
+#include <memory>
+#include <iostream>
+
+#include <engine/graphics/front/module/Module.hpp>
 
 namespace megu {
     class Renderable {
         public:
-            template <class T>
-            void accept(const Window & window, const Camera & camera, Module<T> & modul, const TextureArray & array) {
-                modul.render(window, camera, *static_cast<T *>(this), array);
+            Renderable() = delete;
+
+            template <class T, class M>
+            Renderable(T & object, M & module) 
+            : _pimpl(std::make_unique<RenderableModel<T, M>>(object, module)) {}
+
+            Renderable(const Renderable & src) {
+                this->_pimpl = src._pimpl->clone();
+            }
+
+            Renderable & operator=(const Renderable & src) {
+                this->_pimpl = src._pimpl->clone();
+                return *this;
             }
+
+            Renderable(Renderable &&) = default;
+            Renderable & operator=(Renderable &&) = default;
+
+        private:
+            struct RenderableConcept {
+                virtual ~RenderableConcept() {};
+
+                virtual void render(const Window &, const Camera &, const TextureArray &) const = 0;
+                virtual std::unique_ptr<RenderableConcept> clone() const = 0;
+            };
+
+            template <class T, class M>
+            struct RenderableModel : public RenderableConcept {
+                RenderableModel(T & v, M & m) 
+                : _object{ v }, _module{ m } {}
+
+                void render(const Window & window, const Camera & camera, const TextureArray & array) const override {
+                    this->_module.draw(this->_object, window, camera, array);
+                    
+                }
+
+                std::unique_ptr<RenderableConcept> clone() const override {
+                    return std::make_unique<RenderableModel>(*this);
+                }
+
+                T & _object;
+                M & _module;
+            };
+
+            friend void render_ext(Renderable & renderable, const Window & window, const Camera & camera, const TextureArray & array) {
+                renderable._pimpl->render(window, camera, array);
+            }
+
+            std::unique_ptr<RenderableConcept> _pimpl;
     };
 }
\ No newline at end of file
diff --git a/source/engine/graphics/front/object/Sprite.hpp b/source/engine/graphics/front/object/Sprite.hpp
index 3aab783edff4edb0ca6d2cf6611838b96bc6f53f..44ea1e68fb91c9c00fcc6c5ab3556f465cfc2027 100644
--- a/source/engine/graphics/front/object/Sprite.hpp
+++ b/source/engine/graphics/front/object/Sprite.hpp
@@ -4,9 +4,8 @@
 #include <engine/graphics/back/textures/Texture.hpp> 
 #include <engine/graphics/front/geometry/Quads.hpp>
 
-
 namespace megu {
-    class Sprite  {
+    class Sprite {
         public:
             Sprite(const Texture &);
             Sprite(const Texture &, const glm::vec4 &);
diff --git a/source/engine/graphics/front/object/VerticesArray.hpp b/source/engine/graphics/front/object/VerticesArray.hpp
index bbceaa9c19e51842c5acbb625d45ab971c48f6a3..550958f214b45a2f75abe04d5930c6b5068f80e3 100644
--- a/source/engine/graphics/front/object/VerticesArray.hpp
+++ b/source/engine/graphics/front/object/VerticesArray.hpp
@@ -4,7 +4,6 @@
 
 #include <engine/graphics/back/geometry/Transformable.hpp>
 #include <engine/graphics/back/textures/Texture.hpp> 
-
 #include <engine/graphics/front/geometry/Quads.hpp>
 #include <engine/graphics/front/geometry/Vertex.hpp>
 
diff --git a/source/engine/graphics/utility/module.hpp b/source/engine/graphics/utility/module.hpp
deleted file mode 100644
index 7e90914c4f77cb06704e77d6ab8bce3a5a01060a..0000000000000000000000000000000000000000
--- a/source/engine/graphics/utility/module.hpp
+++ /dev/null
@@ -1,16 +0,0 @@
-#pragma once
-
-#include <engine/graphics/back/cameras/Camera.hpp>
-#include <engine/graphics/front/engine/TextureArray.hpp>
-#include <engine/io/Window.hpp>
-
-namespace megu {
-    template <class T>
-    class Module {
-        public:
-            virtual void render(const Window &, const Camera &, T &, const TextureArray &) = 0;
-    };
-
-    template <class ... Ts>
-    class Multi_Module : public Module<Ts> ... {};
-}
\ No newline at end of file
diff --git a/source/engine/graphics/utility/overloaded.hpp b/source/engine/graphics/utility/overloaded.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..7fd32055955c0a72ea4958a81fb176e72e09e0c4
--- /dev/null
+++ b/source/engine/graphics/utility/overloaded.hpp
@@ -0,0 +1,10 @@
+#pragma once
+
+namespace megu {
+    template <class... Ts>
+    struct overloaded : Ts ... {
+        using Ts::operator()...;
+    };
+
+    template <class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
+}
\ No newline at end of file
diff --git a/source/engine/graphics/utility/ref_set.hpp b/source/engine/graphics/utility/ref_set.hpp
deleted file mode 100644
index b394253f12c2b2bc7841c59118c74fd6544bd0ac..0000000000000000000000000000000000000000
--- a/source/engine/graphics/utility/ref_set.hpp
+++ /dev/null
@@ -1,9 +0,0 @@
-#pragma once
-
-#include <set>
-#include "reference_sorter.hpp"
-
-namespace megu {
-    template <class T>
-    using ref_set = std::set<std::reference_wrapper<T>, reference_sorter<T>>;
-}
\ No newline at end of file
diff --git a/source/main.cpp b/source/main.cpp
index ab619eb05e69b826236624f7848ae536e4a86b1f..2cfef63540deeb8b98433c9ceb9d59b4cce2bed8 100644
--- a/source/main.cpp
+++ b/source/main.cpp
@@ -169,7 +169,8 @@ int main(int argc, const char * argv[]) {
         megu::Renderer basic_renderer(360, 360);
 
         engine.push(0, basic_renderer);
-        engine.push(0, 0, *images.front());
+
+        engine.push<megu::Image>(0, 0, *((images.front()).get()));
 
         //? Render Loop
         std::cout << "Render Loop Begin !" << std::endl;