     if @observer
       value = @getValue @el
 
-      for formatter in @formatters.slice(0).reverse()
+      for formatter, fi in @formatters.slice(0).reverse()
         args = formatter.split /\s+/
         id = args.shift()
 
+        processedArgs = @parseFormatterArguments args, fi
+
         if @view.formatters[id]?.publish
-          value = @view.formatters[id].publish value, args...
+          value = @view.formatters[id].publish value, processedArgs...
 
       @observer.setValue value
 

      id = args.shift()
      formatter = @view.formatters[id]

      args = (Rivets.TypeParser.parse(arg) for arg in args)
      processedArgs = []

      for arg, ai in args
        processedArgs.push if arg.type is 0
          arg.value
        else
          @formatterObservers[fi] or= {}

          unless observer = @formatterObservers[fi][ai]
            observer = @observe @view.models, arg.value, @sync
            @formatterObservers[fi][ai] = observer

          observer.value()

      if formatter?.read instanceof Function
        value = formatter.read.call @model, value, processedArgs...

      @observer = @observe @view.models, @keypath, @sync
      @model = @observer.target

  parseFormatterArguments: (args, formatterIndex) =>
    args = (Rivets.TypeParser.parse(arg) for arg in args)
    processedArgs = []

    for arg, ai in args
      processedArgs.push if arg.type is Rivets.TypeParser.types.primitive
        arg.value
      else
        @formatterObservers[formatterIndex] or= {}

        unless observer = @formatterObservers[formatterIndex][ai]
          observer = @observe @view.models, arg.value, @sync
          @formatterObservers[formatterIndex][ai] = observer

        observer.value()

    processedArgs

  # Applies all the current formatters to the supplied value and returns the
  # formatted value.
  formattedValue: (value) =>
