Throw an exception when a developer redefines object instantiation

If an object has already been instantiated, there should be an exception when a developer tries to redefine the instantiation method.

Before this PR, redefinitions of this type are silently ignored leading to unexpected behaviour.

This change is incompatible with #340 - here I am throwing an exception, in the other PR we are un-instantiating the object. Discussion of why I think this is a better approach can be found on that PR.