During the work I’ve previously done around OpenID Connect and Federation, I ran into the need to be able to mutate Entities.
Every Entity in Known has a type, and internally this corresponds to a PHP Class when loaded from data storage. Each Class has its own abilities and methods, and in general you’re not going to want to turn one into another.
However, I did.
This occurred when a User (which corresponds to a User
) object logs in to a site after they’ve already used the federated API (which would create a RemoteUser
object internally).
When that occurs, we want to convert the RemoteUser
account into a full fat User
. We can’t simply delete and recreate the user as that would lose all their history, and remove any posts they have made, etc.
So, we need a mechanism to mutate them.
This should be safe, since RemoteUser
is a child of User
, so they’re not vastly different things.
So, as of recent builds of Known, RemoteUser
implements the interface Mutable
, which defines a method mutate
that accepts a class name to mutate to. On success it’ll return the newly mutated object. This object will have the same ID and data.
For convenience, there’s also a Trait Mutate
that you can mix in, which provides a reference implementation of this interface. That implementation will check to see that the class you’re wanting to mutate and the class you’re wanting to mutate to are both related, and if so will perform the necessary incantations on the database.
Useful tool, but “with great power…” etc.