Creating the kill function inside the __newindex defeats the purpose of having a self argument. You should either create the function outside and assign it in the metamethod, or remove the self parameter and use . syntax for calling the function.
Metatables are perfectly fine to use in scripts that are not modules?
You don’t necessarily need to use metatables for the module to be required. I don’t think im getting your point. All metatables do is give extra power to tables.
Just wanted to comment that : functions works regardless if it has a metatable or not, all it does is pass the table the function was called with as self, and lua will automatically assign it for you when called with the colon operator.