public static function extract(string $index, string $desired_name, string $namespace = '') : string
{
$state = State::instance();
if (!isset($state->gears[$index])) {
throw new GearNotFound($index);
}
$latest = $state->gears[$index];
$class_name = $desired_name;
$testName = empty($namespace) ? $class_name : $namespace . '\\' . $class_name;
$i = 0;
while (\class_exists($testName, false)) {
$class_name = $desired_name . '_' . \bin2hex('' . ++$i);
$testName = empty($namespace) ? $class_name : $namespace . '\\' . $class_name;
}
// Create the shim
if (!empty($namespace)) {
self::coreEval('namespace ' . $namespace . ';' . "\n\n" . 'class ' . $class_name . ' extends ' . $latest . ' { }');
} else {
self::coreEval('class ' . $class_name . ' extends ' . $latest . ' { }');
}
return $class_name;
}