How to improve this?

I have an unreliable system (probably because of me lacking the ability to think of complex stuff) which is an object oriented module for melee weapons, it currently looks like this:

Registry [Module Script] (has a table that has instances of Weapon class)
→ Weapon class [Module Script], has properties describing stats
->-> Script to append to Weapon’s dummy tool (tool that has the model, handle and nothing else)
→ Types [Module Script] (contains Weapon class type to fix type-error in autocompletion)

After putting a freshly .new() Weapon into Registry’s table I call it’s function to return a modified Tool which I’m later going to put into StarterPack. The Tool’s script figures out it’s class (and therefore stats) by taking a look at it’s name (set by function) and comparing it to Registry’s classes. Obviously the script handles Tool’s events for hitting, playing animations, etc. What I hate about it is that there’s no way to implement custom functionality for some Weapons (for example changing base health) without adding unnecessary arguments into Weapon constructor, also the way Script figures out it’s class seems really wrong.

Is there anything I can improve about this? Apologies for any bad grammar, english is not my first language.

I also heard of approach where you make all (unique) weapons separate module script classes, but I don’t really know is it worth trying

you should keep the shared functionality in the weapons class but then make modules for separate weapons that get used inside the weapon class based on which weapon is being used

instead of adding more arguments you can pass a dictionary so you can pass a variable number of arguments

Alright so inheritance, but what about my way of detecting what class weapon is? I don’t think its great