/** * @param $class * @param $newClass * @param array $types * @return string * @throws \Nette\InvalidArgumentException */ protected function prepareClassTemplate($class, $newClass, array $types = array()) { $ref = ClassType::from($class); if (!$ref->hasAnnotation('template')) { throw new InvalidArgumentException("Class '{$class}' is not template. Annotation @template is not defined"); } $str = trim(file_get_contents($ref->getFileName())); $namespace = $ref->getNamespaceName(); $templateTypes = explode(' ', preg_replace('!\\s+!', ' ', str_replace(',', ' ', $ref->getAnnotation('template')))); if (count($templateTypes) !== count($types)) { throw new InvalidArgumentException(); } $template = new Template($str); $template->replaceClassName($newClass); foreach ($templateTypes as $key => $templateType) { $template->replaceClassString($templateType, $types[$key]); } $template->makeAbsoluteClassNames($namespace); return (string) $template; }