I wonder if this really belongs in the model layer? Two reasons:
* I think it is probably a model concern
* It would be good to eventually share this code with bouncer, and sharing models (via a gem) is probably how we'd do that