Subversion-Projekte lars-tiefland.laravel_shop

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
148 lars 1
<?php
2
 
3
/*
4
 Copyright (c) 2009 hamcrest.org
5
 */
6
 
7
/**
8
 * Controls the process of extracting @factory doctags
9
 * and generating factory method files.
10
 *
11
 * Uses File_Iterator to scan for PHP files.
12
 */
13
class FactoryGenerator
14
{
15
    /**
16
     * Path to the Hamcrest PHP files to process.
17
     *
18
     * @var string
19
     */
20
    private $path;
21
 
22
    /**
23
     * @var array of FactoryFile
24
     */
25
    private $factoryFiles;
26
 
27
    public function __construct($path)
28
    {
29
        $this->path = $path;
30
        $this->factoryFiles = array();
31
    }
32
 
33
    public function addFactoryFile(FactoryFile $factoryFile)
34
    {
35
        $this->factoryFiles[] = $factoryFile;
36
    }
37
 
38
    public function generate()
39
    {
40
        $classes = $this->getClassesWithFactoryMethods();
41
        foreach ($classes as $class) {
42
            foreach ($class->getMethods() as $method) {
43
                foreach ($method->getCalls() as $call) {
44
                    foreach ($this->factoryFiles as $file) {
45
                        $file->addCall($call);
46
                    }
47
                }
48
            }
49
        }
50
    }
51
 
52
    public function write()
53
    {
54
        foreach ($this->factoryFiles as $file) {
55
            $file->build();
56
            $file->write();
57
        }
58
    }
59
 
60
    public function getClassesWithFactoryMethods()
61
    {
62
        $classes = array();
63
        $files = $this->getSortedFiles();
64
        foreach ($files as $file) {
65
            $class = $this->getFactoryClass($file);
66
            if ($class !== null) {
67
                $classes[] = $class;
68
            }
69
        }
70
 
71
        return $classes;
72
    }
73
 
74
    public function getSortedFiles()
75
    {
76
        $iter = $this->getFileIterator();
77
        $files = array();
78
        foreach ($iter as $file) {
79
            $files[] = $file;
80
        }
81
        sort($files, SORT_STRING);
82
 
83
        return $files;
84
    }
85
 
86
    private function getFileIterator()
87
    {
88
        $factoryClass = class_exists('File_Iterator_Factory') ? 'File_Iterator_Factory' : 'SebastianBergmann\FileIterator\Factory';
89
 
90
        $factory = new $factoryClass();
91
 
92
        return $factory->getFileIterator($this->path, '.php');
93
    }
94
 
95
    public function getFactoryClass($file)
96
    {
97
        $name = $this->getFactoryClassName($file);
98
        if ($name !== null) {
99
            require_once $file;
100
 
101
            if (class_exists($name)) {
102
                $class = new FactoryClass(substr($file, strpos($file, 'Hamcrest/')), new ReflectionClass($name));
103
                if ($class->isFactory()) {
104
                    return $class;
105
                }
106
            }
107
        }
108
 
109
        return null;
110
    }
111
 
112
    public function getFactoryClassName($file)
113
    {
114
        $content = file_get_contents($file);
115
        if (preg_match('/namespace\s+(.+);/', $content, $namespace)
116
            && preg_match('/\n\s*class\s+(\w+)\s+extends\b/', $content, $className)
117
            && preg_match('/@factory\b/', $content)
118
        ) {
119
            return $namespace[1] . '\\' . $className[1];
120
        }
121
 
122
        return null;
123
    }
124
}