public function loadFromFile($filename, $line = null) { $oldClassnames = get_declared_classes(); require_once $filename; $newClassnames = array_diff(get_declared_classes(), $oldClassnames); $specifications = array(); foreach ($newClassnames as $classname) { $class = new ReflectionClass($classname); if ($class->isAbstract()) { continue; } if (!$class->implementsInterface('PHPSpec2\\SpecificationInterface')) { continue; } $preFunctions = array(); if ($class->hasMethod('let')) { $preFunctions[] = $class->getMethod('let'); } $postFunctions = array(); if ($class->hasMethod('letgo')) { $postFunctions[] = $class->getMethod('letgo'); } $specification = new Node\Specification($class->getName()); $subject = $this->getClassSubject($class->getName()); foreach ($class->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { if (!preg_match('/^(it_|its_)/', $method->getName())) { continue; } if (null !== $line && !$this->lineIsInsideMethod($line, $method)) { continue; } $example = new Node\Example(str_replace('_', ' ', $method->getName()), $subject, $method); array_map(array($example, 'addPreFunction'), $preFunctions); array_map(array($example, 'addPostFunction'), $postFunctions); $specification->addChild($example); } if (count($specification->getChildren())) { $specifications[] = $specification; } } return $specifications; }