diff --git a/packages/core/src/Kernel/LoadDiscoveryClasses.php b/packages/core/src/Kernel/LoadDiscoveryClasses.php index 6c7e2c65e..eb6df9888 100644 --- a/packages/core/src/Kernel/LoadDiscoveryClasses.php +++ b/packages/core/src/Kernel/LoadDiscoveryClasses.php @@ -198,11 +198,22 @@ private function scan(DiscoveryLocation $location, array $discoveries, string $p // Resolve `#[SkipDiscovery]` for this class $skipDiscovery = $input->getAttribute(SkipDiscovery::class); - if ($skipDiscovery !== null && $skipDiscovery->except === []) { - $this->shouldSkipForClass[$className] = true; - } elseif ($skipDiscovery !== null) { - foreach ($skipDiscovery->except as $except) { - $this->shouldSkipForClass[$className][$except] = true; + if ($skipDiscovery !== null) { + // Evaluate conditional skip + try { + if ($skipDiscovery->when !== null && ($skipDiscovery->when)() !== true) { + return; + } + } catch (Throwable) { + return; + } + + if ($skipDiscovery->except === []) { + $this->shouldSkipForClass[$className] = true; + } else { + foreach ($skipDiscovery->except as $except) { + $this->shouldSkipForClass[$className][$except] = true; + } } } diff --git a/packages/discovery/src/SkipDiscovery.php b/packages/discovery/src/SkipDiscovery.php index fe8e56d0d..90c05aa61 100644 --- a/packages/discovery/src/SkipDiscovery.php +++ b/packages/discovery/src/SkipDiscovery.php @@ -5,6 +5,7 @@ namespace Tempest\Discovery; use Attribute; +use Closure; /** * Instruct Tempest to not discover this class. @@ -15,8 +16,10 @@ public function __construct( /** * Allows the specified `Discovery` classes to still discover this class. - * @var array> + * @param array> + * @param Closure|null */ public array $except = [], + public ?Closure $when = null, ) {} }