support recursive destructuring