sub traverse { return unless defined $_[SELF]; $_[CODE_TO_RUN]->( ... ); $_[SELF] = $_[SELF][FIRST_DAUGHTER] || $_[SELF][NEXT_SISTER] || undef; goto &traverse; }