use constant { SELF => 0, CODE_TO_RUN => 1, FIRST_DAUGHTER => 0, LAST_DAUGHTER => 1, NEXT_SISTER => 2, PREVIOUS_SISTER => 3, PARENT => 4, }; ## then in your methods sub traverse { if( $_[SELF][FIRST_DAUGHTER] ) { traverse( $_[SELF][FIRST_DAUGHTER], $_[CODE_TO_RUN] ); } elsif( $_[SELF][NEXT_SISTER] ) { traverse( $_[SELF][NEXT_SISTER], $_[CODE_TO_RUN] ); elsif( ... ) ...; } return; } #### sub traverse { return unless defined $_[SELF]; $_[CODE_TO_RUN]->( ... ); $_[SELF] = $_[SELF][FIRST_DAUGHTER] || $_[SELF][NEXT_SISTER] || undef; goto &traverse; }