support recurive pattern