       if @view.formatters[id]?.publish
         value = @view.formatters[id].publish value, args...
 
-    @view.adapters['.'].publish @model, @keypath, value
+    @view.adapters[@key.interface].publish @model, @key.path, value
 
   # Subscribes to the model for changes at the specified keypath. Bi-directional
   # routines will also listen for changes on the element to propagate them back
   # to the model.
   bind: =>
     @binder.bind?.call @, @el
-    @view.adapters['.'].subscribe @model, @keypath, @sync
+    @view.adapters[@key.interface].subscribe @model, @key.path, @sync
     @sync() if @view.config.preloadData
 
     if @options.dependencies?.length


      pipes = (pipe.trim() for pipe in declaration.split '|')
      context = (ctx.trim() for ctx in pipes.shift().split '<')
      path = context.shift()
      splitPath = path.split '.'
      options.formatters = pipes

      if splitPath[0]
        key = splitPath.shift()
      else
        key = null
        splitPath.shift()

      keypath = splitPath.join '.'

      if dependencies = context.shift()
        options.dependencies = dependencies.split /\s+/

      @bindings.push new Rivets[binding] @, node, type, key, keypath, options

    parse = (node) =>
      unless node in skipNodes

# differences while avoiding it being overwritten.
class Rivets.TextBinding extends Rivets.Binding
  # Initializes a text binding for the specified view and text node.
  constructor: (@view, @el, @type, @keypath, @options = {}) ->
    interfaces = (k for k, v of @view.adapters)
    tokens = Rivets.KeypathParser.parse(@keypath, interfaces, '.')
    @formatters = @options.formatters || []
    @setModel()

  # A standard routine binder used for text node bindings.
  binder:
