@@ -155,6 +155,7 @@ private function extractPermissionsFromClass(ReflectionClass $class): array
155155 $ classGuard = $ this ->getClassGuard ($ class );
156156 $ classLabel = $ this ->getClassAttribute ($ class , Label::class)?->value;
157157 $ classDescription = $ this ->getClassAttribute ($ class , Description::class)?->value;
158+ $ classCapabilities = $ this ->getClassCapabilityNames ($ class );
158159
159160 foreach ($ class ->getReflectionConstants (ReflectionClassConstant::IS_PUBLIC ) as $ constant ) {
160161 $ value = $ constant ->getValue ();
@@ -166,14 +167,15 @@ private function extractPermissionsFromClass(ReflectionClass $class): array
166167 $ labelAttr = $ this ->getConstantAttribute ($ constant , Label::class);
167168 $ descAttr = $ this ->getConstantAttribute ($ constant , Description::class);
168169 $ contextAttr = $ this ->getConstantAttribute ($ constant , Context::class);
170+ $ constantCapabilities = $ this ->getCapabilityNames ($ constant );
169171
170172 $ definitions [] = PermissionDefinition::fromAttributes ([
171173 'name ' => $ value ,
172174 'guard ' => $ classGuard ,
173175 'label ' => $ labelAttr !== null ? $ labelAttr ->value : $ classLabel ,
174176 'description ' => $ descAttr !== null ? $ descAttr ->value : $ classDescription ,
175177 'context ' => $ contextAttr ?->modelClass,
176- 'capabilities ' => $ this -> getCapabilityNames ( $ constant ),
178+ 'capabilities ' => array_unique ( array_merge ( $ classCapabilities , $ constantCapabilities ) ),
177179 'source_class ' => $ class ->getName (),
178180 'source_constant ' => $ constant ->getName (),
179181 ]);
@@ -321,4 +323,20 @@ private function getCapabilityNames(ReflectionClassConstant $constant): array
321323 $ attributes
322324 );
323325 }
326+
327+ /**
328+ * Get all capability names from a class's Capability attributes.
329+ *
330+ * @param ReflectionClass<object> $class
331+ * @return array<string>
332+ */
333+ private function getClassCapabilityNames (ReflectionClass $ class ): array
334+ {
335+ $ attributes = $ class ->getAttributes (CapabilityAttribute::class);
336+
337+ return array_map (
338+ fn ($ attr ) => $ attr ->newInstance ()->name ,
339+ $ attributes
340+ );
341+ }
324342}
0 commit comments