if ( 0 == @_ ) { if ( 0 < @fifo && $next < @fifo ) { return $fifo[$next++]; } else { $next = 0; return; } } elsif defined($_[0]) { ... and so on } else { ... handle 'reset' et al. }