           @sourcePosition = lastSourcePosition
           return
 
-    unless @position.compare(position) is 0
-      overshoot = position.traversalFrom(lastPosition)
-      lastSourcePosition = lastSourcePosition.traverse(overshoot)
-      @position = position
-      @sourcePosition = lastSourcePosition
-    @transformBuffer.reset(@position, @sourcePosition)
-
-  seekToSourcePosition: (position, clip = CLIP_BACKWARD) ->
-    @position = Point.zero()
-    @sourcePosition = Point.zero()
-    @transformBuffer.reset(@position, @sourcePosition)
-    position = position.sanitize()
-
-    return if position.isZero()
-
-    until @sourcePosition.compare(position) >= 0
-      lastPosition = @position
-      lastSourcePosition = @sourcePosition
-      {done} = @next()
-      return if done
-
-    if @clipping? and @sourcePosition.compare(position) > 0
-      switch clip
-        when CLIP_FORWARD
-          return
-        when CLIP_BACKWARD
-          @position = lastPosition
-          @sourcePosition = lastSourcePosition
-          return
-
-    unless @sourcePosition.compare(position) is 0
-      overshoot = position.traversalFrom(lastSourcePosition)
-      lastPosition = lastPosition.traverse(overshoot)
-      @position = lastPosition
-      @sourcePosition = position
+    unless seekPropertyFn().compare(position) is 0
+      calculateOvershoot(position, lastPosition, lastSourcePosition)
 
     @transformBuffer.reset(@position, @sourcePosition)
 


    return if position.isZero()

    until @position.compare(position) >= 0
      lastPosition = @position
      lastSourcePosition = @sourcePosition
      {done} = @next()
      return if done

    if @clipping? and @position.compare(position) > 0
      switch clip
        when CLIP_FORWARD
          return

    else
      {value: undefined, done: true}

  seek: (position, clip) ->
    calculateOvershoot = (position, lastPosition, lastSourcePosition) =>
      overshoot = position.traversalFrom(lastPosition)
      lastSourcePosition = lastSourcePosition.traverse(overshoot)
      @position = position
      @sourcePosition = lastSourcePosition

    @_seek (=> @position), position, calculateOvershoot, clip

  seekToSourcePosition: (position, clip) ->
    calculateOvershoot = (position, lastPosition, lastSourcePosition) =>
      overshoot = position.traversalFrom(lastSourcePosition)
      lastPosition = lastPosition.traverse(overshoot)
      @position = lastPosition
      @sourcePosition = position

    @_seek (=> @sourcePosition), position, calculateOvershoot, clip

  _seek: (seekPropertyFn, position, calculateOvershoot, clip = CLIP_BACKWARD) ->
    @position = Point.zero()
    @sourcePosition = Point.zero()
    @transformBuffer.reset(@position, @sourcePosition)
