public function implementing($interface)
{
foreach (func_get_args() as $interface) {
$file = str_replace('\\', self::DS, $interface) . '.php';
$path = implode(self::DS, [__DIR__, self::INTERFACE_EXTENSIONS_DIR, $file]);
if (isset(self::$registry[$interface]) || file_exists($path)) {
if (!isset(self::$registry[$interface])) {
$existing_traits = get_declared_traits();
$extension = (include $path);
self::$extensions = array_merge(self::$extensions, $extension);
self::$registry[$interface] = array_diff(get_declared_traits(), $existing_traits);
return $this->implementing($interface);
} else {
foreach (self::$registry[$interface] as $trait) {
$this->using($trait);
}
}
}
//
// We want to create the interface if it doesn't exist yet. We don't want to
// qualify the namespace until below.
//
if (!interface_exists($interface)) {
$fqin = ltrim($interface, '\\');
$parts = explode('\\', $fqin);
$interface = array_pop($parts);
$ns = implode('\\', $parts);
eval(call_user_func(function () use($ns, $interface) {
ob_start();
?>
namespace <?php
echo $ns;
?>
{
interface <?php
echo $interface;
?>
{}
}
<?php
return ob_get_clean();
}));
}
self::$interfaces[$this->class][] = self::qualify($ns . '\\' . $interface);
}
return $this;
}