       else ''
     else if match = sub.match /^[=|\+](\w+)$/
       @helpers?[ match[1] ]?.call @
-    else undefined
+    else sub
+
+  getSource: ( segments, source = @model ) ->
+    for segment in segments
+      if segment of source then source = source[ segment ]
+      else
+        console.warn "%s: chain \"%s\" is invalid, segment \"%s\" not exists in %O", @_name, segments.join( '.' ), segment, source
+        return null
+    source
 
   analizeChain: ( chain, source = @model ) ->
     segments = chain.split '.'
     property = segments.pop()
-    for segment in segments
-      if segment of source then source = source[ segment ]
-      else break
-    unless property of source
-      console.warn "%s: chain \"%s\" is invalid", @_name, chain
-      return null
+    return null unless source = @getSource segments, source
     [ source, property ]

        .replace( /{\s*yield\s*}/g, '<div class="yield"></div>' )
      unless RegExp( "^<[^>]+" + @_name ).test @template
        @template = "<div class=\"#{ @_name }\">#{ @template }</div>"
      @parseRelations()
      container.parentNode.removeChild container
    else console.warn 'Template %s not exists', @_name
    @

  parseRelations: ->
    @relationsMap = []
    @template = @template.replace  /{\s*(\w+) of @(\w+)\s*}/g, ( match, view, relation ) =>
      className =  relation.capitalize() + view.capitalize() + 'Relation'
      @relationsMap.push selector: '.' + className, name: relation, view: view
      "<div class=\"#{ className }\"></div>"
    @parseAssistants()
    @

  parseAssistants: ->


  runModelCallback: ( type ) ->
    @model[ type ]?[ @_shortName ]?.call @model
    @

  runLink: ( event ) ->
