Since origin tends to cast around, we should allow that too, by exposing the implementation type and using a shared_ptr instead of a value class.
Since origin tends to cast around, we should allow that too, by exposing the implementation type and using a shared_ptr instead of a value class.