public function visit($data)
{
if (!is_object($data)) {
throw new Exceptions\InvalidTypeException($data);
}
$checkedClassNames = array();
$className = get_class($data);
do {
$checkedClassNames[] = $className;
if (isset($this->visitors[$className])) {
return $this->visitors[$className]->visit($this->outputVisitor, $this->outputGenerator, $data);
}
} while ($className = get_parent_class($className));
throw new Exceptions\NoVisitorFoundException($checkedClassNames);
}