dom.forEachChildEl(el, function(childEl) {
     if (childEl.id) {
         var descendentWidget = widgets.get(childEl.id);
         if (descendentWidget) {
             _destroy(descendentWidget, false, false);
         }
     }
     
     walkDOM(childEl);
 });
            _destroy = function(widget, removeNode, recursive) {
                var message = {
                        widget: widget
                    },
                    rootEl = widget.getEl(),
                    widgets = require('raptor/widgets'),
                    assignedId = widget._assignedId;
                
                widget.publish('beforeDestroy', message);
                
                widget.__destroyed = true;
                
                
                if (rootEl) {
                    if (recursive) {
                        var walkDOM = function(el) {
                            dom.forEachChildEl(el, function(childEl) {
                                if (childEl.id) {
                                    var descendentWidget = widgets.get(childEl.id);
                                    if (descendentWidget) {
                                        _destroy(descendentWidget, false, false);
                                    }
                                }
                                
                                walkDOM(childEl);
                            });
                        };

                        walkDOM(rootEl);
                    }
                    
                    if (removeNode && rootEl.parentNode) {
                        //Remove the widget's DOM nodes from the DOM tree if the root element is known
                        rootEl.parentNode.removeChild(rootEl);
                    }
                }
                
                widgets._remove(widget._id);

                if (assignedId) {
                    var scopeWidget = widgets.get(widget._scope);
                    if (scopeWidget) {
                        scopeWidget.widgets._remove(widget, assignedId);
                    }
                }

                widget.publish('destroy', message);

                // Have the widget unsubscribe from any messages that is currently subscribed to
                // Unsubscribe all messages after publishing "destroy" otherwise the widget might not get that event
                listeners.unsubscribeFromAll(widget);
            },