$from,'to'=>$to,'cache'=>[],'usage'=>[]];try{return $operation();}finally{self::$scope=$previous;}} public static function active():bool{return self::$scope!==null;} public static function range():?array{return self::$scope===null?null:[self::$scope['from'],self::$scope['to']];} public static function remember(\wpdb $db,string $key,callable $read):mixed{if(self::$scope===null)return $read();$key=spl_object_id($db).':'.$db->prefix.':'.$key;if(!array_key_exists($key,self::$scope['cache']))self::$scope['cache'][$key]=$read();return self::$scope['cache'][$key];} public static function usageKey(array $plan):string{return implode(':',[$plan['member_id'],$plan['rule_id']??$plan['id'],$plan['period_start'],$plan['period_end']]);} public static function pendingUsage(array $plan):int{return self::$scope['usage'][self::usageKey($plan)]??0;} public static function addUsage(array $plans):void{if(self::$scope===null)return;foreach($plans as $p){$key=self::usageKey($p);self::$scope['usage'][$key]=(self::$scope['usage'][$key]??0)+$p['requested_seconds'];}} public static function invalidate():void{if(self::$scope!==null)self::$scope['cache']=[];} }