         else # not closable, not handled, return
           expr
 
-      invoke: (@action)->
+      perform: (@action)->
         @findAndPerformAction(@expr)
 
       wasFound: -> @found


    class_mixer(_TrailingOperatorHandling)

    exports =
      calculate: Calculate
      square: Square
      append_decimal: AppendDecimal
      append_number: AppendNumber
      exponentiate_last: ExponentiateLast
      append_multiplication: AppendMultiplication
      append_addition: AppendAddition
      append_equals: AppendEquals
      append_subtraction: AppendSubtraction
      negate_last: Negation
      open_sub_expression: OpenSubExpression
      close_sub_expression: CloseSubExpression
      append_division: AppendDivision
      append_pi: AppendPi
      square_root: SquareRoot
      append_root: AppendRoot
      append_variable: AppendVariable

    class ExpressionManipulationSource
      initialize: (@comps)->
      classes: exports
    ttm.class_mixer(ExpressionManipulationSource)

    for name, klass of exports
      build_klass = do (name, klass)->
        (opts={})->
          opts.component_source = @comps
          klass.build(opts)
      ExpressionManipulationSource.prototype["build_#{name}"] = build_klass


        if last instanceof @comps.classes.number
          new_last = last.clone()
          new_last = new_last.futureAsDecimal()
          new_exp = expression.replaceLast(new_last)
        else
          new_last = @comps.build_number(value: 0)
          new_last = new_last.futureAsDecimal()
          new_exp = expression.append(new_last)
        @pointer = @pos.build(new_exp.last().id())
        new_exp

      perform: (expression)->
        resulting_expression =
          _FinalOpenSubExpressionApplication.build(expr: expression, comps: @comps).
            performOrDefault((expr)=> @onFinalExpression(expr))

        expression: resulting_expression
        position: @pointer


    class_mixer(AppendDecimal)

