This is cool. I like how this logic is all in a user model.