Openzeppelin - Things for major upgrade

Couple of things that I think should be thought of for OZ's major 5.x upgrades.

The belows are for 4.x versions.

  • Why is upgradeToAndCall external ? Sometimes I want to override it, do my stuff and then call super.upgradeToAndCall, but because of external, it’s impossible.

  • Why not make modifier reinitializer virtual ? And whatever is inside it put in the internal virtual function ? Sometimes it's needed to override it, do my stuff !

  • If implementation passed to upgradeTo is the same as the currently set one, why do you still emit the event ?

  • are you planning on changing reinitializer which accepts uint256 instead of uint8 ? I understand why you did uint8, but since it's gonna be major, I'd change it to uint256

If you have suggestions for changes in the library, please post them as issues on the repo. Some of these are good suggestions so please post them.

I definitely disagree with making reinitializer virtual... Why would you want to override it?