<?php

declare(strict_types=1);

namespace ProxyManager\Example\GhostObjectSkippedProperties;

use Closure;
use ProxyManager\Factory\LazyLoadingGhostFactory;
use ProxyManager\Proxy\GhostObjectInterface;
use ReflectionProperty;

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

class User
{
    private ?int $id = null;

    private ?string $username = null;

    public function getId() : ?int
    {
        return $this->id;
    }

    public function getUsername() : ?string
    {
        return $this->username;
    }
}

(static function () : void {
    $proxy = (new LazyLoadingGhostFactory())->createProxy(
        User::class,
        static function (
            GhostObjectInterface $proxy,
            string $method,
            array $parameters,
            ?Closure & $initializer,
            array $properties
        ) {
            $initializer = null;

            var_dump('Triggered lazy-loading!');

            $properties["\0ProxyManager\\Example\\GhostObjectSkippedProperties\\User\0username"] = 'Ocramius';

            return true;
        },
        [
            'skippedProperties' => ["\0User\0id"],
        ]
    );

    $idReflection = new ReflectionProperty(User::class, 'id');

    $idReflection->setAccessible(true);
    $idReflection->setValue($proxy, 123);

    var_dump($proxy->getId());
    var_dump($proxy->getUsername());
})();