<?php

declare(strict_types=1);

namespace ProxyManager\Example\VirtualProxy;

use Closure;
use ProxyManager\Factory\LazyLoadingValueHolderFactory;

require_once __DIR__ . '/../vendor/autoload.php';

class Foo
{
    public function __construct()
    {
        sleep(1);
    }

    public function doFoo() : void
    {
        echo 'Foo!';
    }
}

(static function () : void {
    $startTime = microtime(true);
    $factory   = new LazyLoadingValueHolderFactory();
    $i         = 0;

    do {
        $proxy = $factory->createProxy(
            Foo::class,
            static function (
                ?object & $wrappedObject, ?object $proxy, string $method, array $parameters, ?Closure & $initializer
            ) {
                $initializer = null;
                $wrappedObject = new Foo();

                return true;
            }
        );

        $i += 1;
    } while ($i < 1000);

    var_dump('time after 1000 instantiations: ' . (microtime(true) - $startTime));

    $proxy->doFoo();

    var_dump('time after single call to doFoo: ' . (microtime(true) - $startTime));
})();