diff --git a/src/projectile.cpp b/src/projectile.cpp
index 4643cbe..1105bf7 100644
--- a/src/projectile.cpp
+++ b/src/projectile.cpp
@@ -3,14 +3,20 @@
 #include <godot_cpp/classes/node3d.hpp>
 
 namespace godot {
-void IProjectile::return_to_pool() {
+void Projectile::_bind_methods() {
+#define CLASSNAME Projectile
+}
+void Projectile::return_to_pool() {
     if(!this->pool)
         return;
-    Node3D *node = dynamic_cast<Node3D*>(this);
-    if(node)
-        this->pool->return_projectile(node);
+    this->pool->return_projectile(this);
 }
-void IProjectile::set_projectile_pool(ProjectilePool *pool) {
+
+void Projectile::set_weapon_data(Ref<WeaponData> data) {
+    this->data = data;
+}
+
+void Projectile::set_projectile_pool(ProjectilePool *pool) {
     this->pool = pool;
 }
 }
diff --git a/src/projectile.hpp b/src/projectile.hpp
index 0a97670..fbb5f34 100644
--- a/src/projectile.hpp
+++ b/src/projectile.hpp
@@ -2,17 +2,21 @@
 #define PROJECTILE_HPP
 
 #include "weapon_data.hpp"
+#include <godot_cpp/classes/node3d.hpp>
+
 namespace godot {
-class Node3D;
 class ProjectilePool;
 
-class IProjectile {
+class Projectile : public Node3D {
+    GDCLASS(Projectile, Node3D);
+    static void _bind_methods();
 public:
-    virtual void set_weapon_data(Ref<WeaponData> data) = 0;
     void return_to_pool();
+    void set_weapon_data(Ref<WeaponData> data);
     void set_projectile_pool(ProjectilePool *pool);
-private:
+protected:
     ProjectilePool *pool{nullptr};
+    Ref<WeaponData> data{nullptr};
 };
 }