Yes, but.
I mean what if the system for taking something out of your backpack is large enough that is deserves its own file. This is a problem I come across all the time in OOP. You can't keep loading all the code into a single file, just because it belongs there. Like for example what business does the character instance have needing to manage the backpack when it probably has 100 other things it's doing.
OOP is constantly bashing up against things like the single responsibility principle, and everything else. Code just doesn't belong along side data. But, OOP, it sticks around forever.
:)
I'm sorry I'm just frustrated. So, specifically what I'm doing right now is building out some AI for my character. A character has many actions, when an action is running it's receiving process and physics_process method calls. That way the action could be causing the character to do just about anything.
But what I've ended up doing is just passing in all the extra data I need, in order to avoid cyclical references. Every process and physics_process tick is receiving the simulation resource itself as well as the character instance it's acting on and the delta.
This is the absolute cleanest possible solution I am able to come up with, since I can't reference either of those things. If I reference those things then I can't reference the actions from the simulation or the character. And since I'm passing references around like those I'm not really using OOP for anything. Which makes me feel like I'm not going about it the right way.
I do get your point about signals I'm trying to use those as well but they seem limited by only accepting a single parameter in gdscript. And I'm finding I'm ending up passing a signal to a instance that triggers another signal and so on.
Like I understand the principles of object oriented programming, it's the first thing I learned when I went to school like everyone else. But in practice it always turns into this madhouse for me.