diff --git a/includes/abilities-api/class-wp-abilities-registry.php b/includes/abilities-api/class-wp-abilities-registry.php index 8e4dc6c2..8ec5867e 100644 --- a/includes/abilities-api/class-wp-abilities-registry.php +++ b/includes/abilities-api/class-wp-abilities-registry.php @@ -18,6 +18,14 @@ * @access private */ final class WP_Abilities_Registry { + /** + * The singleton instance of the registry. + * + * @since 0.1.0 + * @var ?self + */ + private static $instance = null; + /** * Holds the registered abilities. * @@ -259,11 +267,9 @@ public function get_registered( string $name ): ?WP_Ability { * @return \WP_Abilities_Registry The main registry instance. */ public static function get_instance(): self { - /** @var \WP_Abilities_Registry $wp_abilities */ - global $wp_abilities; + if ( null === self::$instance ) { + self::$instance = new self(); - if ( empty( $wp_abilities ) ) { - $wp_abilities = new self(); /** * Fires when preparing abilities registry. * @@ -274,10 +280,10 @@ public static function get_instance(): self { * * @param \WP_Abilities_Registry $instance Abilities registry object. */ - do_action( 'abilities_api_init', $wp_abilities ); + do_action( 'abilities_api_init', self::$instance ); } - return $wp_abilities; + return self::$instance; } /** diff --git a/tests/unit/abilities-api/wpRegisterAbility.php b/tests/unit/abilities-api/wpRegisterAbility.php index e3709a12..f1337aba 100644 --- a/tests/unit/abilities-api/wpRegisterAbility.php +++ b/tests/unit/abilities-api/wpRegisterAbility.php @@ -43,10 +43,10 @@ public function set_up(): void { 'description' => 'The result of adding the two numbers.', 'required' => true, ), - 'execute_callback' => function ( array $input ): int { + 'execute_callback' => static function ( array $input ): int { return $input['a'] + $input['b']; }, - 'permission_callback' => function (): bool { + 'permission_callback' => static function (): bool { return true; }, 'meta' => array( @@ -60,9 +60,11 @@ public function set_up(): void { */ public function tear_down(): void { foreach ( wp_get_abilities() as $ability ) { - if ( str_starts_with( $ability->get_name(), 'test/' ) ) { - wp_unregister_ability( $ability->get_name() ); + if ( ! str_starts_with( $ability->get_name(), 'test/' ) ) { + continue; } + + wp_unregister_ability( $ability->get_name() ); } parent::tear_down(); @@ -147,7 +149,7 @@ public function test_register_valid_ability(): void { public function test_register_ability_no_permissions(): void { do_action( 'abilities_api_init' ); - self::$test_ability_properties['permission_callback'] = function (): bool { + self::$test_ability_properties['permission_callback'] = static function (): bool { return false; }; $result = wp_register_ability( self::$test_ability_name, self::$test_ability_properties ); @@ -200,7 +202,7 @@ public function test_execute_ability_no_input_schema_match(): void { public function test_execute_ability_no_output_schema_match(): void { do_action( 'abilities_api_init' ); - self::$test_ability_properties['execute_callback'] = function (): bool { + self::$test_ability_properties['execute_callback'] = static function (): bool { return true; }; $result = wp_register_ability( self::$test_ability_name, self::$test_ability_properties ); @@ -243,7 +245,7 @@ public function test_permission_callback_receives_input(): void { do_action( 'abilities_api_init' ); $received_input = null; - self::$test_ability_properties['permission_callback'] = function ( array $input ) use ( &$received_input ): bool { + self::$test_ability_properties['permission_callback'] = static function ( array $input ) use ( &$received_input ): bool { $received_input = $input; // Allow only if 'a' is greater than 'b' return $input['a'] > $input['b']; @@ -310,25 +312,26 @@ public function test_get_existing_ability() { $name = self::$test_ability_name; $properties = self::$test_ability_properties; - $callback = function ( $instance ) use ( $name, $properties ) { + $callback = static function ( $instance ) use ( $name, $properties ) { wp_register_ability( $name, $properties ); }; add_action( 'abilities_api_init', $callback ); - // Temporarily set `$wp_abilities` to null to ensure `wp_get_ability()` triggers `abilities_api_init` action. - $old_wp_abilities = $wp_abilities; - $wp_abilities = null; + // Reset the Registry, to ensure it's empty before the test. + $registry_reflection = new ReflectionClass( WP_Abilities_Registry::class ); + $instance_prop = $registry_reflection->getProperty( 'instance' ); + $instance_prop->setAccessible( true ); + $instance_prop->setValue( null ); $result = wp_get_ability( $name ); - $wp_abilities = $old_wp_abilities; - remove_action( 'abilities_api_init', $callback ); $this->assertEquals( new WP_Ability( $name, $properties ), - $result + $result, + 'Ability does not share expected properties.' ); }