smarter constructor