/// <summary>
        /// Filters a collection of permissions to only include permissions for a specific entity type.
        /// </summary>
        /// <param name="permissionsToFilter">The collection of permissions to filter</param>
        /// <param name="entityDefinitionCode">The definition code of the entity to filter on e.g. PageEntityDefinition.DefinitionCode</param>
        /// <returns>Filtered collection cast to IEnumerable{IEntityPermission}</returns>
        public virtual IPermissionSetBuilder ApplyRoleConfiguration <TRoleDefinition>(Func <IEnumerable <IPermission>, IEnumerable <IPermission> > additionalFilter = null)
            where TRoleDefinition : IRoleDefinition
        {
            var roleDefinition = _roleDefinitionRepository.GetRequired <TRoleDefinition>();
            var guard          = _circularDependencyGuard;

            if (guard != null)
            {
                guard.AddRole <TRoleDefinition>();
            }
            else
            {
                guard = new CircularDependencyGuard(roleDefinition);
            }

            var builder = new PermissionSetBuilder(
                guard,
                AvailablePermissions,
                ServiceProvider,
                _rolePermissionInitializerFactory,
                _entityDefinitionRepository,
                _roleDefinitionRepository
                );

            var permissionInitializer = _rolePermissionInitializerFactory.Create(roleDefinition);

            permissionInitializer.Initialize(builder);
            var rolePermissions = builder.Build();

            return(Include(permissions => rolePermissions, additionalFilter));
        }
 private PermissionSetBuilder(
     CircularDependencyGuard circularDependencyGuard,
     IEnumerable <IPermission> allPermissions,
     IServiceProvider serviceProvider,
     IRolePermissionInitializerFactory rolePermissionInitializerFactory,
     IEntityDefinitionRepository entityDefinitionRepository,
     IRoleDefinitionRepository roleDefinitionRepository
     )
 {
     _circularDependencyGuard          = circularDependencyGuard;
     AvailablePermissions              = allPermissions;
     ServiceProvider                   = serviceProvider;
     _rolePermissionInitializerFactory = rolePermissionInitializerFactory;
     _entityDefinitionRepository       = entityDefinitionRepository;
     _roleDefinitionRepository         = roleDefinitionRepository;
 }