I'm trying to understand how to create an "ownable" implementation that is used with a proxy.
the "Ownable" pattern assign the initial owner to
msg.sender in the constructor, and later
transferOwnership() validates the call is from the current owner.
However, when initializing a proxy clone using an "implementation" contract, its constructor is not called: we use the "Initializer" pattern, where we have a plain method to act as a "constructor" to initialize the object.
Now from within this initializer method, we can't use
transferOwnership(): the current owner is "address(0)", and can't be changed.
What we need is a mechanism to allow us force the owner (but only from the within the initializer function)
As far as I understand, this can't be done by overriding either Ownable or Initializable template contracts, since both
Initializable._initializing are private . It requires (at a minimum) creating a copy of
Ownable with non-private _setOwner