/**
 * トラバース可能なミックスイン。
 * @private
 */
Ext.define('Ext.mixin.Traversable', {
    extend: 'Ext.Mixin',

    mixinConfig: {
        id: 'traversable'
    },

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

        return this;
    },

    /**
     * このコンポーネントが親を持つ場合は`true`を返します。
     * @return {Boolean} このコンポーネントが親を持つ場合は`true`
     */
    hasParent: function() {
        return Boolean(this.parent);
    },

    /**
     * このコンポーネントの親がある場合はそれを返します。
     * @return {Ext.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;
    }
});