private static function make($class)
{
//
// Trim out our leading namespace separator to get a root relative full qualified
// class name.
//
$fqcn = ltrim($class, '\\');
$class = self::qualify($class);
//
// Determine the appropriate parent
//
$parent = !isset(self::$parents[$fqcn]) ? self::qualify(__NAMESPACE__ . '\\Quip') : self::$parents[$fqcn];
//
// Collect interfaces
//
$interfaces = isset(self::$interfaces[$class]) ? self::$interfaces[$class] : array();
//
// Collect traits
//
$traits = isset(self::$traits[$class]) ? self::$traits[$class] : array();
//
// Break out our namespace and class
//
$parts = explode('\\', $fqcn);
$class = array_pop($parts);
$ns = implode('\\', $parts);
if (!class_exists($parent, FALSE)) {
return self::make($parent);
}
//
// Create a class
//
eval(call_user_func(function () use($ns, $class, $parent, $interfaces, $traits) {
ob_start();
?>
namespace <?php
echo $ns;
?>
{
class <?php
echo $class;
?>
<?php
if ($parent) {
?>
extends <?php
echo $parent;
?>
<?php
}
?>
<?php
if (count($interfaces)) {
?>
implements <?php
echo implode(', ', $interfaces);
?>
<?php
}
?>
{
<?php
foreach ($traits as $trait) {
?>
use <?php
echo $trait;
?>
;
<?php
}
?>
}
}
<?php
return ob_get_clean();
}));
}