 
     undefined # prevent stray output
 
-  runTemplate rootModel, Object.prototype, rootTemplate
+  runTemplate rootModel, {}, createNotifier(), Object.prototype, rootTemplate

      newValue = getter()
      if newValue isnt value
        value = newValue
        runTemplate value, viewInstance, subTemplate

    runTemplate value, viewInstance, subTemplate

    # return a handle to be able to unwatch
    { clear: clear }

  runTemplate = (model, viewPrototype, template, preInitMap) ->
    viewModel = {}
    viewModelNotify = createNotifier()

    bindVariable = (name, subTemplate) ->
      bindOnChange (-> viewModel[name]), viewModelNotify, viewInstance, subTemplate


    viewInstance =
      fork: (map, subTemplate) ->
        # create clean sub-view model and initialize it with given values
        runTemplate model, viewModel, viewModelNotify, viewInstance, subTemplate, map

      get: () ->
        # @todo type-check for primitives for true immutability
