supports @constructor