<?php
declare(strict_types=1);
namespace ConfManager\Traits;

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}


/**
 * シングルトンパターンを提供するトレイト
 *
 * @since 1.0.0
 */
trait Singleton {

	/**
	 * @var static|null
	 */
	private static ?self $instance = null;

	/**
	 * インスタンスを取得する
	 *
	 * @return static
	 */
	public static function instance(): static {
		if ( null === static::$instance ) {
			static::$instance = new static();
		}
		return static::$instance;
	}

	/**
	 * コンストラクタを外部から呼び出し不可にする
	 */
	private function __construct() {
		$this->init();
	}

	/**
	 * サブクラスで初期化処理をオーバーライドするためのメソッド
	 */
	protected function init(): void {}

	/**
	 * クローン禁止
	 */
	private function __clone() {}

	/**
	 * シリアライズ復元禁止
	 */
	public function __wakeup(): void {
		throw new \RuntimeException( 'Cannot unserialize a singleton.' );
	}
}
