permissions[$name] ?? null; } public function addPermission(Permission $permission) : bool{ if(!isset($this->permissions[$permission->getName()])){ $this->permissions[$permission->getName()] = $permission; return true; } return false; } public function removePermission(Permission|string $permission) : void{ if($permission instanceof Permission){ unset($this->permissions[$permission->getName()]); }else{ unset($this->permissions[$permission]); } } public function subscribeToPermission(string $permission, PermissibleInternal $permissible) : void{ if(!isset($this->permSubs[$permission])){ $this->permSubs[$permission] = []; } $this->permSubs[$permission][spl_object_id($permissible)] = $permissible; } public function unsubscribeFromPermission(string $permission, PermissibleInternal $permissible) : void{ if(isset($this->permSubs[$permission][spl_object_id($permissible)])){ if(count($this->permSubs[$permission]) === 1){ unset($this->permSubs[$permission]); }else{ unset($this->permSubs[$permission][spl_object_id($permissible)]); } } } public function unsubscribeFromAllPermissions(PermissibleInternal $permissible) : void{ foreach($this->permSubs as $permission => $subs){ if(count($subs) === 1 && isset($subs[spl_object_id($permissible)])){ unset($this->permSubs[$permission]); }else{ unset($this->permSubs[$permission][spl_object_id($permissible)]); } } } /** * @return PermissibleInternal[] */ public function getPermissionSubscriptions(string $permission) : array{ return $this->permSubs[$permission] ?? []; } /** * @return Permission[] */ public function getPermissions() : array{ return $this->permissions; } public function clearPermissions() : void{ $this->permissions = []; } }