support infinite recursion