def METHOD_NAME():
    global last_gen
    if SMOOTHED:
        duration[:] += life * TENACITY
        duration[:] *= DECAY
    if time.ticks_ms() - last_gen < GENERATION_TIME_MS:
        return
    last_gen = time.ticks_ms()
    if numpy.sum(life) < MINIMUM_LIFE:
        seed_life()
        return
    # Rollin' rollin' rollin.
    _N = numpy.roll(life, -1, axis=0)
    _NW = numpy.roll(_N, -1, axis=1)
    _NE = numpy.roll(_N, 1, axis=1)
    _S = numpy.roll(life, 1, axis=0)
    _SW = numpy.roll(_S, -1, axis=1)
    _SE = numpy.roll(_S, 1, axis=1)
    _W = numpy.roll(life, -1, axis=1)
    _E = numpy.roll(life, 1, axis=1)
    # Compute the total neighbours for each cell
    neighbours[:] = _N + _NW + _NE + _S + _SW + _SE + _W + _E
    next_generation[:] = life[:]
    # Any cells with exactly three neighbours should always stay alive
    next_generation[:] += neighbours[:] == 3
    # Any alive cells with less than two neighbours should die
    next_generation[:] -= (neighbours[:] < 2) * life
    # Any alive cells with more than three neighbours should die
    next_generation[:] -= (neighbours[:] > 3) * life
    life[:] = numpy.clip(next_generation, 0, 1)