Организация многоуровневой структуры категорий на php в Kohana 3

Написал свой первый модуль для kohana. Он решает задачи организации хранения древовидной структуры категорий в СУБД и построения меню из этих категорий.
Ссылка на скачивание.
Ниже код и пример использования…

CREATE TABLE IF NOT EXISTS `categories` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `parent` int(10) unsigned DEFAULT '0',
  `level` int(10) unsigned DEFAULT '0',
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
<?php defined('SYSPATH') OR die('No direct access allowed.');
/**
 * Класс решает задачи организации хранения древовидной структуры категорий в СУБД
 * и построения меню из этих категорий.
 *
 * phpdreamer 
 * 16.08.2010
 */
class Categories {

    public $code;                                                               
    public $path = '/shop/cat/';                                                //путь для построения ссылок
                                                                                //- если путь /shop/cat/ , то ссылки на категории будут /shop/cat/{id}
    protected $parents;                                                         
    protected $names;                                                           
    protected $level;                                                           

/**
 * Метод возвращает HTML код меню
 * (используется отображение MODPATH.'categories/views/item.php')
 * @param string $path - путь к контроллеру категорий от корня виртуального сервера 
 * @return string
 */
    public function menu($path)
    {
        $array = DB::select()->from('categories')                               //выборка категорий
                ->order_by('parent')
                ->as_object()
                ->execute();
        
        foreach ($array as $value)                                              //информация разделяется на 3 массива (для удобства)
        {
            $this->parents[$value->id] = $value->parent;
            $this->names[$value->id] = $value->name;
            $this->level[$value->id] = $value->level;
        }
        $this->path = $path;                                                    //переданный $path устанавливает свойство класса
        $this->build();                                                         //запуск рекурсивной функции
        return $this->code;                                                     //ф-я возвращает HTML код
    }
/**
 * Рекурсивная функция для построения меню.
 * Принимает id категории
 * @param <type> $id
 */
    protected function build($id=0)
    {
        if($id)
            $this->code .= $this->render($id, $this->names[$id], $this->level[$id]);

        foreach ($this->parents as $PerentId => $PerentParentId)
            if($PerentParentId == $id)
                $this->build($PerentId);
    }
/**
 * Подставляет id, имя и уровень вложенности категории в отображение
 * Возвращает строку меню
 * @param int $id
 * @param string $name
 * @param int $level
 * @return string
 */
    protected function render($id,$name,$level)
    {
        return View::factory('item')
                ->set('id', $id)
                ->set('name', $name)
                ->set('level', $level)
                ->set('path', $this->path)
                ->render();
    }
}

Пример использования:

$cat = new Categories();
echo $cat->menu(url::base() . 'shop/cat/');

— echo есстественно следует заменить на подстановку в отображение (view).

P.S.: Долго пришлось гуглить чтобы найти подобное специально для kohana, так и не нашел. Не нашел и класса, который можно легко адаптировать. Пришлось, в некотором смысле, изобритать велосипед (идея с parent_id очень распространенная, но вариантов как собрать из этого меню — у каждого свой). Надеюсь, мое решение не самое плохое (всего 1 запрос к БД, и около 25 строк ООП кода).