 
 # Filters
 # -------
-filters = Batman.Filters = 
+filters = Batman.Filters =
   truncate: (value, length, end = "...") ->
     if value.length > length
       value = value.substr(0, length-end.length) + end

    \s*               # Be insensitive to whitespace between the comma and the actual arguments.
    (?!               # Use a lookahead to ensure we aren't matching true or false:
      (?:true|false)  # Match either true or false ...
      \s*             # and make sure that there's nothing else that comes after the true or false ... 
      (?:$|,)         # before the end of this argument in the list.
    )
    ([a-zA-Z][\w\.]*) # Now that true and false can't be matched, match a dot delimited list of keys.
    \s*               # Be insensitive to whitespace before the next comma or end of the filter arguments list.
    (?:$|,)           # Match either the next comma or the end of the filter arguments list.
    ///
  
  # The `binding` which calculates the final result by reducing the initial value through all the filters.
  @accessor 'binding'
    get: -> 
      @filterFunctions.reduce (value, fn, i) =>
        # Get any argument keypaths from the context stored at parse time.
        args = @filterArguments[i].map (argument) ->


# The Render context class manages the stack of contexts accessible to a view during rendering.
class RenderContext
  constructor: (contexts...) ->
    @contexts = contexts
    @storage = new Batman.Object
    @contexts.push @storage

  findKey: (key) ->
    base = key.split('.')[0]
    i = @contexts.length
    while i--
      context = @contexts[i]
      if context.get?
        val = context.get(key)
      else
        val = context[base]
      return [val, context] if val?
    return [container.get(key), container]
