| 
<?phpdeclare(strict_types=1);
 
 use ParagonIE\TypedArrays\ObjectTypedArray;
 
 // Load all the wrappers for scalar type
 require_once __DIR__ . '/bool-array.php';
 require_once __DIR__ . '/float-array.php';
 require_once __DIR__ . '/int-array.php';
 require_once __DIR__ . '/string-array.php';
 require_once __DIR__ . '/double-array.php';
 require_once __DIR__ . '/functions.php';
 
 spl_autoload_register(function (string $class_name) {
 /* Security note: This will not allow escape characters, so the eval() below should be ok. */
 if (!preg_match('#([A-Za-z0-9\\\\]+)(??+)$#', $class_name, $m)) {
 // We are only interested in autoloading typed arrays
 return false;
 }
 switch ($m[1]) {
 case 'string':
 case 'int':
 case 'float':
 case 'bool':
 // These wre autoloaded above!
 return false;
 default:
 if (!class_exists($m[1]) && !interface_exists($m[1])) {
 return false;
 }
 }
 
 // Okay, now let's generate the type container at runtime.
 $depth = mb_str_split($m[2], 2, 'utf-8');
 $composite = $m[1];
 for ($i = 0; $i < count($depth); ++$i) {
 if (!class_exists($composite . '??', false)) {
 // Class definition
 $exec = "class {$composite}?? extends " . ObjectTypedArray::class .
 "\n{\n" .
 "    protected const string OBJECT_TYPE = '{$composite}';\n" .
 "}\n\n";
 // Function helper
 $exec .= "function {$composite}??({$composite} ...\$args): {$composite}??\n" .
 "{\n" .
 "    return new {$composite}??(...\$args);\n" .
 "}\n\n";
 /* We may want to consider dumping to a file instead of just executing. */
 eval($exec);
 }
 $composite .= '??';
 }
 // For performance, you're going to want to use opcache
 return true;
 });
 
 |