public function getChildComponents($select = array())
    {
        $select = $this->_formatSelect($select);
        $sc = $select->getHash();
        if (isset($this->_childComponentsCache[$sc])) {
            Kwf_Benchmark::count('getChildComponents cached');
        } else {
            Kwf_Benchmark::count('getChildComponents uncached');
        }

        if (!isset($this->_childComponentsCache[$sc])) {

            $this->_childComponentsCache[$sc] = array();

            if ($select->getPart(Kwf_Component_Select::WHERE_COMPONENT_CLASSES) === array()) {
                return $this->_childComponentsCache[$sc]; //vorzeitig abbrechen, da kommt sicher kein ergebnis
            }

            if ($select->hasPart(Kwf_Component_Select::LIMIT_COUNT)) {
                $limitCount = $select->getPart(Kwf_Component_Select::LIMIT_COUNT);
            } else {
                $limitCount = null;
            }

            $generators = Kwf_Component_Generator_Abstract::getOwnInstances($this, $select);
            $ret = $this->_getChildComponentsFromGenerators($generators, $select, $limitCount);

            if (is_null($limitCount) || count($ret) < $limitCount) { //wenn limit nicht erreicht, inherited generator auch noch fragen
                if (!is_null($limitCount)) $limitCount -= count($ret);
                $generators = Kwf_Component_Generator_Abstract::getInheritedInstances($this, $select);
                $ret += $this->_getChildComponentsFromGenerators($generators, $select, $limitCount); //kein array_merge, da wuerden die keys verloren gehen - und die sind eh eindeutig
            }

            $this->_childComponentsCache[$sc] = $ret;
        }
        return $this->_childComponentsCache[$sc];
    }