columns method shouldn't alter internal state
Hopefully less confusing API
Improve docs a bit