       if @motion.isLinewise?()
         @editor.setCursorScreenPosition([cursor.getScreenRow(), 0])
 
-  # Public: Marks this as complete and saves the motion.
-  #
-  # motion - The motion used to select what to delete.
-  #
-  # Returns nothing.
-  compose: (motion) ->
-    if not motion.select
-      throw new OperatorError("Delete must compose with a motion")
-
-    @motion = motion
-    @complete = true
-
 #
 # It changes everything selected by the following motion.
 #
-class Change
-  motion: null
-  complete: null
-  vimState: null
-
-  constructor: (@editor, @vimState) ->
-    @complete = false
-
-  isComplete: -> @complete
-
+class Change extends Operator
   # Public: Changes the text selected by the given motion.
   #
   # count - The number of times to execute.
   #
   # Returns nothing.
   execute: (count=1) ->
-    operator = new Delete(@editor, @vimState,
-      motion: @motion, allowEOL: true, selectOptions: {excludeWhitespace: true})
+    operator = new Delete(@editor, @vimState, allowEOL: true, selectOptions: {excludeWhitespace: true})
+    operator.compose(@motion)
     operator.execute(count)
 
     @vimState.activateInsertMode()
 
-  # Public: Marks this as complete and saves the motion.
-  #
-  # motion - The motion used to select what to change.
-  #
-  # Returns nothing.
-  compose: (motion) ->
-    if not motion.select
-      throw new OperatorError("Change must compose with a motion")
-
-    @motion = motion
-    @complete = true
-
 #
 # It copies everything selected by the following motion.
 #
-class Yank
-  motion: null
-  complete: null
-  register: null
-  vimState: null
-
-  constructor: (@editor, @vimState) ->
-    @complete = false
-    @register ?= '"'
-
-  isComplete: -> @complete
+class Yank extends Operator
+  register: '"'
 
   # Public: Copies the text selected by the given motion.
   #

          @editor.moveCursorUp()
          @editor.moveCursorToFirstCharacterOfLine()

  # Public: Not implemented.
  #
  # Returns nothing.
  compose: (register) ->
    throw new OperatorError("Not Implemented")

#
# It combines the current line with the following line.
#
class Join
  constructor: (@editor) ->

  isComplete: -> true

  # Public: Combines the current with the following lines
  #

  # Returns nothing.
  execute: (count=1) ->
    cursor = @editor.getCursor()

    @undoTransaction =>
      _.times count, =>
        if _.last(@motion.select(1, @selectOptions))
          @editor.getSelection().delete()
