<?php
/**
 * プラグイン本体（シングルトン）。
 *
 * 各機能クラスの初期化とフック登録の起点。
 *
 * @package Neutrope_Japanese_Invoice_PDFs_For_WooCommerce
 */

defined( 'ABSPATH' ) || exit;

/**
 * Class WCJBP_Plugin
 */
final class WCJBP_Plugin {

	/**
	 * 単一インスタンス。
	 *
	 * @var WCJBP_Plugin|null
	 */
	private static $instance = null;

	/**
	 * 管理画面ハンドラ。
	 *
	 * @var WCJBP_Admin
	 */
	public $admin;

	/**
	 * 注文画面ハンドラ。
	 *
	 * @var WCJBP_Order
	 */
	public $order;

	/**
	 * マイアカウントハンドラ。
	 *
	 * @var WCJBP_MyAccount
	 */
	public $myaccount;

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

	/**
	 * コンストラクタ。
	 */
	private function __construct() {
		$this->admin     = new WCJBP_Admin();
		$this->order     = new WCJBP_Order();
		$this->myaccount = new WCJBP_MyAccount();

		$this->admin->init();
		$this->order->init();
		$this->myaccount->init();
	}

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

	/**
	 * アンシリアライズ禁止。
	 *
	 * @throws \Exception 常に例外を投げる。
	 * @return void
	 */
	public function __wakeup() {
		throw new \Exception( 'Unserializing is not allowed.' );
	}
}
