             if @isNew() then super else @get 'url'
 
         parse: (response) =>
-            @nodes = {}
-
             if response
+                @nodes = {}
                 @node = DataContextNode.parseAttrs response.json, null, @cacheNode
 
             return response

            return @

        add: (nodes...) ->
            if @type isnt 'branch'
                throw new Error 'Node is not a branch. Use "promote" to convert it into one'
            @attributes.children.push.apply @attributes.children, _.map nodes, (attrs) =>
                DataContextNode.parseAttrs attrs, @

        siblings: ->
            if @root then false else _.without @parent.get('children'), @

        # Proxy methods
        isEmpty: ->
            _.isEmpty @attributes

        isBranch: ->
            isBranch @attributes

        isCondition: ->
            isCondition @attributes

        isComposite: ->
            isComposite @attributes

        # Creates a new branch and adds this node along with one or more other
        # nodes to the branch
        promote: (nodes...) ->
            if _.isString nodes[0]
                type = nodes[0]
                if type isnt 'and' and type isnt 'or'
                    throw new Error 'Type must be "and" or "or"'
                nodes.splice 0, 1
            else
                type = 'and'

            if nodes.length is 0
                throw new Error 'At least one other node must be supplied'

            children = _.map [@toJSON(), nodes...], (attrs) =>
                DataContextNode.parseAttrs attrs, @

            @clear slient: true
            @set type: type, children: children
            return @
