use the designated initializer