       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()
+      processedArgs = @parseFormatterArguments args, fi
 
       if formatter?.read instanceof Function
         value = formatter.read.call @model, value, processedArgs...

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

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

    if @observer
      value = @getValue @el

      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, processedArgs...

      @observer.setValue value

