even more flexible constructor (is this getting out of hand?)