*/ private $definitions; /** * Constructor. * * @param BuildProfile $profile Build profile. * @param LicenseStatus $status Commercial status. * @param array $definitions Optional definitions. */ public function __construct( BuildProfile $profile, LicenseStatus $status, array $definitions = array() ) { $this->profile = $profile; $this->status = $status; $this->definitions = array() === $definitions ? self::create_default_definitions() : $definitions; } /** * Create default future feature definitions. * * @return array */ public static function create_default_definitions(): array { $commercial_profiles = array( BuildProfile::PRO_FREEMIUS, BuildProfile::PRO_CODECANYON, BuildProfile::DEVELOPMENT, ); $definitions = array(); foreach ( self::get_known_feature_ids() as $feature_id ) { $definitions[ $feature_id ] = new FeatureDefinition( $feature_id, $commercial_profiles, true ); } return $definitions; } /** * Get known future commercial feature IDs. * * @return array */ public static function get_known_feature_ids(): array { return array( self::FEATURE_WOO_PROTECTION, self::FEATURE_GRAVITY_FORMS, self::FEATURE_FLUENT_FORMS, self::FEATURE_FORMIDABLE_FORMS, self::FEATURE_ELEMENTOR_PRO_FORMS, self::FEATURE_QUARANTINE, self::FEATURE_AUDIT_EXPORT, self::FEATURE_CSV_EXPORT, self::FEATURE_ADVANCED_RULES, self::FEATURE_AGENCY_PRESETS, self::FEATURE_SETTINGS_IMPORT_EXPORT, self::FEATURE_PRIORITY_SUPPORT, ); } /** * Get feature availability. * * @param string $feature_id Feature ID. */ public function get_availability( string $feature_id ): FeatureAvailability { if ( ! isset( $this->definitions[ $feature_id ] ) ) { return FeatureAvailability::unavailable( $feature_id, FeatureAvailability::REASON_UNKNOWN_FEATURE ); } $definition = $this->definitions[ $feature_id ]; if ( ! $definition->allows_profile( $this->profile ) ) { return FeatureAvailability::unavailable( $feature_id, FeatureAvailability::REASON_PROFILE_DISABLED ); } if ( $definition->requires_active_status() && ! $this->status->is_active() ) { return FeatureAvailability::unavailable( $feature_id, FeatureAvailability::REASON_LICENSE_INACTIVE ); } return FeatureAvailability::available( $feature_id ); } /** * Whether a feature is available. * * @param string $feature_id Feature ID. */ public function is_available( string $feature_id ): bool { return $this->get_availability( $feature_id )->is_available(); } }