There are a number of ActionOnEvent classes that hook directly into the Projectile class, subscribing to the events the class provides. Generally these would be added to a specific Projectile object, but they could be added to other classes, so long as the Projectile field is populated.
If you do assign a projectile at runtime, use the public AssignProjectile(Projectile newProjectile) method. This will automatically unsubscribe from the existing projectile (if applicable), and subscribe to the new one as well.
Other classes like ActionRunner can also be used on Projectiles to perform actions.
Actions from Projectile Spawner Events
There are also a number of ActionOnEvent classes that hook directly into the ProjectileSpawner class, just as the ones that hook into the Projectile class.
The same pattern is used for assigning a new ProjectileSpawner at runtime as the Projectile event classes.