ctor is optional