    /**
     * A Traversable mixin.
     * @private
     */
    Ext.define('Ext.mixin.Traversable', {
        extend: 'Ext.mixin.Mixin',

        mixinConfig: {
            id: 'traversable'
        },

        setParent: function(parent) {
            this.parent = parent;

            return this;
        },

        /**
         * @member Ext.Component
         * Returns `true` if this component has a parent.
         * @return {Boolean} `true` if this component has a parent.
         */
        hasParent: function() {
            return Boolean(this.parent);
        },

        /**
         * @member Ext.Component
         * Returns the parent of this component, if it has one.
         * @return {Ext.Component} The parent of this component.
         */
        getParent: function() {
            return this.parent;
        },

        getAncestors: function() {
            var ancestors = [],
                parent = this.getParent();

            while (parent) {
                ancestors.push(parent);
                parent = parent.getParent();
            }

            return ancestors;
        },

        getAncestorIds: function() {
            var ancestorIds = [],
                parent = this.getParent();

            while (parent) {
                ancestorIds.push(parent.getId());
                parent = parent.getParent();
            }

            return ancestorIds;
        }
    });