Best way to approach creating a framework using OOP

I’ve been using OOP for about 2 months now but I’m still a bit confused on some aspects of it. I’m going to make a fishing framework but I don’t know how I’m going to approach it. When the player joins I want to create a fishing rod object but I want methods to be attached to that object that can be used on the client and the server, and I also want properties of the rod that can be accessed on the server but not on the client. For example, I need to detect when the tool has been activated and check the mouse’s position on the client to cast the rod but I also need to show the casting of the rod on the server.

Should I have two separate classes on the server and the client to handle the rod on both ends? Or should I just have one class on the client and handle everything server side using remote events? Should I not use remote events at all and create one class inside of ReplicatedStorage that can be accessed from both the server and the client to call methods on? I’m trying to use the best practice I can and I can’t find any threads that break down how to properly use OOP when creating whole frameworks and not just using simple objects as examples.

Yes you can have two versions of the framework. A client version that handles input and effects and a server version which handles all the logic. If you create a class that can be called from the server and the client then you would have to have other scripts to call the methods on the server and client. If you chose to do this make sure your doing checks for the server stuff.

So I should have two classes on the client and server that communicate via remote events?

Also, when should I be creating the fishing rod objects? Should I create one whenever the player’s character spawns and when they equip a brand new fishing rod?

Deciding whenever you create the object is totally not my decision to make. It all depends on whether you want it to be a tool the player can equip or you want the player to spawn with it. And yes you can communicate via remotes events between the two modules.