support recursive types