_data["text"] = $text;
    $this->_data["type"] = $type;
    $this->_data["url"] = $url;
  }
  public function __get($key) {
    if (array_key_exists($key, $this->_data)) {
      return $this->_data[$key];
    }
    throw new Exception("@todo UNDEFINED PROPERTY");
  }
  public function __set($key, $value) {
    $this->_data[$key] = $value;
  }
}
class Menu_Link extends Menu_Item {
  public function __construct($text="", $url="#") {
    parent::__construct("link", $text, $url);
  }
  public function __toString() {
    return "
url\">$this->text";
  }
}
class Menu_Dialog extends Menu_Item {
  public function __construct($text="", $url="#", $class="gDialogLink") {
    parent::__construct("dialog", $text, $url);
    $this->dialog_class = $class;
    $this->title = $text;
  }
  public function __toString() {
    return "dialog_class\" href=\"$this->url\" " .
           "title=\"$this->title\">$this->text";
  }
}
class Menu_Core extends Menu_Item {
  public function __construct($text="", $url="#") {
    parent::__construct("menu", $text, $url);
    $this->_data['items'] = array();
  }
  public function append($menu_item) {
    $items = $this->items;
    $items[] = $menu_item;
    $this->items = $items;
  }
  public function get($text) {
    foreach ($this->items as $item) {
      if ($item->text == $text) {
        return $item;
      }
    }
    return false;
  }
  private function _get_index($text) {
    foreach ($this->items as $idx => $item) {
      if ($item->text == $text) {
        return (int)$idx;
      }
    }
    return false;
  }
  public function insert_before($text, $menu_item) {
    $offset = $this->_get_index($text);
    Kohana::log("debug", "$offset: $offset");
    $items = $this->items;
    $front_part = ($offset == 0) ? array() : array_splice($items, 0, $offset);
    $back_part = ($offset == 0) ? $this->items : array_splice($items, $offset - 1);
    Kohana::log("debug", print_r($front_part, 1));
    Kohana::log("debug", print_r($front_part, 1));
    $this->items = array_merge($front_part, array($menu_item), $back_part);
  }
  public function insert_after($text, $menu_item) {
    $offset = $this->_get_index($text);
    $last_offset = count($this->items) - 1;
    // If not found, then append to the end
    if ($offset == false) {
      $offset = $last_offset;
    }
    $items = $this->items;
    $front_part = ($offset == $last_offset) ? $this->items : array_splice($items, 0, $offset + 1);
    $back_part = ($offset == $last_offset) ? array() : array_splice($items,  $offset - 1);
    $this->items = array_merge($front_part, array($menu_item), $back_part);
  }
  public function __toString() {
    Kohana::log("debug", print_r($this, 1));
    $items_html = array();
    $item_text = $this->text;
    if (!empty($item_text)) {
      $items_html[] = "$item_text";
    }
    $items = $this->items;
    if (!empty($items)) {
      $items_html[] = "";
      foreach ($items as $item) {
        $items_html[] = $item->__toString();
      }
      $items_html[] = "
";
    }
    if (!empty($item_text)) {
      $items_html[] = "";
    }
    return implode("\n", $items_html);
  }
}