Pārlūkot izejas kodu

Add a Mustache Autoloader implementation.

Justin Hileman 13 gadi atpakaļ
vecāks
revīzija
01312d3e98

+ 54 - 0
src/Mustache/Autoloader.php

@@ -0,0 +1,54 @@
+<?php
+
+namespace Mustache;
+
+/**
+ * Mustache class autoloader.
+ */
+class Autoloader {
+
+	private $baseDir;
+
+	/**
+	 * Autoloader constructor.
+	 *
+	 * @param string $baseDir Mustache library base directory (default: __DIR__.'/..')
+	 */
+	public function __construct($baseDir = null) {
+		$this->baseDir = rtrim($baseDir, '/') ?: __DIR__.'/..';
+	}
+
+	/**
+	 * Register a new instance as an SPL autoloader.
+	 *
+	 * @param string $baseDir Mustache library base directory (default: __DIR__.'/..')
+	 *
+	 * @return \Mustache\Autoloader Registered Autoloader instance
+	 */
+	static public function register($baseDir = null) {
+		$loader = new self($baseDir);
+		spl_autoload_register(array($loader, 'autoload'));
+
+		return $loader;
+	}
+
+	/**
+	 * Autoload Mustache classes.
+	 *
+	 * @param string $class
+	 */
+	public function autoload($class) {
+		if ($class[0] === '\\') {
+			$class = substr($class, 1);
+		}
+
+		if (strpos($class, 'Mustache') !== 0) {
+			return;
+		}
+
+		$file = sprintf('%s/%s.php', $this->baseDir, str_replace('\\', '/', $class));
+		if (is_file($file)) {
+			require $file;
+		}
+	}
+}

+ 28 - 0
test/Mustache/Test/AutoloaderTest.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace Mustache\Test;
+
+use Mustache\Autoloader;
+
+/**
+ * @group unit
+ */
+class AutoloaderTest extends \PHPUnit_Framework_TestCase {
+	public function testRegister() {
+		$loader = Autoloader::register();
+		$this->assertTrue(spl_autoload_unregister(array($loader, 'autoload')));
+	}
+
+	public function testAutoloader() {
+		$loader = new Autoloader(__DIR__.'/../../fixtures/autoloader');
+
+		$this->assertNull($loader->autoload('NonMustacheClass'));
+		$this->assertFalse(class_exists('NonMustacheClass'));
+
+		$loader->autoload('Mustache\Foo');
+		$this->assertTrue(class_exists('Mustache\Foo'));
+
+		$loader->autoload('\Mustache\Bar');
+		$this->assertTrue(class_exists('Mustache\Bar'));
+	}
+}

+ 2 - 12
test/bootstrap.php

@@ -1,16 +1,6 @@
 <?php
 
-require __DIR__.'/../src/Mustache/Buffer.php';
-require __DIR__.'/../src/Mustache/Compiler.php';
-require __DIR__.'/../src/Mustache/Context.php';
-require __DIR__.'/../src/Mustache/Loader.php';
-require __DIR__.'/../src/Mustache/Loader/MutableLoader.php';
-require __DIR__.'/../src/Mustache/Loader/ArrayLoader.php';
-require __DIR__.'/../src/Mustache/Loader/FilesystemLoader.php';
-require __DIR__.'/../src/Mustache/Loader/StringLoader.php';
-require __DIR__.'/../src/Mustache/Mustache.php';
-require __DIR__.'/../src/Mustache/Parser.php';
-require __DIR__.'/../src/Mustache/Template.php';
-require __DIR__.'/../src/Mustache/Tokenizer.php';
+require __DIR__.'/../src/Mustache/Autoloader.php';
+\Mustache\Autoloader::register();
 
 require __DIR__.'/lib/yaml/lib/sfYamlParser.php';

+ 7 - 0
test/fixtures/autoloader/Mustache/Bar.php

@@ -0,0 +1,7 @@
+<?php
+
+namespace Mustache;
+
+class Bar {
+	// nada
+}

+ 7 - 0
test/fixtures/autoloader/Mustache/Foo.php

@@ -0,0 +1,7 @@
+<?php
+
+namespace Mustache;
+
+class Foo {
+	// nada
+}

+ 5 - 0
test/fixtures/autoloader/NonMustacheClass.php

@@ -0,0 +1,5 @@
+<?php
+
+class NonMustacheClass {
+	// noop
+}