build=require __DIR__.'/build.php'; $this->resolvedPlan=$this->build['edition']==='lite'?'lite':$provider->plan(); $this->features=FeatureCatalog::features($this->resolvedPlan); } public static function current():self{return self::$instance??=new self(new \ABeCe\Booking\Licensing\FreemiusEntitlementProvider(function_exists('abece_booking_fs')?abece_booking_fs():null));} /** PHP-only dependency injection; no option, request argument or public filter can choose a plan. */ public static function using(EntitlementProviderInterface $provider,callable $operation):mixed{$previous=self::$instance;self::$instance=new self($provider);try{return $operation();}finally{self::$instance=$previous;}} public static function setTestProvider(EntitlementProviderInterface $provider):void{if(!defined('ABECE_BOOKING_ENTITLEMENT_TESTING')||ABECE_BOOKING_ENTITLEMENT_TESTING!==true)throw new \LogicException('Test provider is disabled');self::$instance=new self($provider);} public function plan():string{return $this->resolvedPlan;} public function edition():string{return $this->build['edition'];} public function has(string $feature):bool{if(!array_key_exists($feature,$this->features))throw new \InvalidArgumentException('Unknown feature: '.$feature);return $this->features[$feature];} public function limit(string $name):?int{return match($name){'resources'=>FeatureCatalog::resourceLimit($this->plan()),'online_resources'=>FeatureCatalog::onlineResourceLimit($this->plan()),default=>throw new \InvalidArgumentException('Unknown limit')};} public function require(string $feature):void{if(!$this->has($feature))throw new CatalogException('feature_not_available',__('This feature is not available in this edition.','abece-booking'),403,null,['feature'=>$feature]);} public function manifest():array{return ['edition'=>$this->edition(),'plan'=>$this->plan(),'features'=>$this->features,'limits'=>['resources'=>$this->limit('resources'),'online_resources'=>$this->limit('online_resources')],'modules'=>$this->build['modules']];} public function updateSupportEntitled():?bool{return $this->provider->updateSupportEntitled();} }