Look into Actor Components.
- a base component each skill inherits from
- the functionality of the skill is defined in each component
- those components are spawned and given to the player, dynamically
- before doing so, check if a component already exists, if so → call lvl up on that existing component instead
- the player can communicate with the components through an interface
- the comps can talk back to the owner directly, through a dispatcher or an interface (you could implement a two-way interface)