constructor now returns self