globalOnlyPermissions); $perms = new Perms(); $perms->setPrefix($this->prefix); $perms->setCheckSequence($this->getSequence($alternateCheck, $fixedCheck)); $perms->setResolverFactories($this->getFactories()); $accessor = $perms->getAccessor([]); $alternateCheck->setResolver($accessor->getResolver()); $fixedCheck->setResolver($accessor->getResolver()); return $perms; } public function withCategories($with = true) { $this->categories = (bool) $with; return $this; } public function withDefinitions($definitions = []) { $this->definitions = $definitions; $adminPermissions = []; foreach ($definitions as $row) { $permName = $row['name']; if ($row['admin']) { $adminPermissions[ $row['type'] ] = substr($permName, strlen($this->prefix)); } } // Create a map from the permission to the admin permission foreach ($definitions as $row) { $permName = $row['name']; $type = $row['type']; if (isset($adminPermissions[$type]) && ! $row['admin']) { $permName = substr($permName, strlen($this->prefix)); $this->adminPermissionMap[$permName] = $adminPermissions[$type]; } } foreach ($definitions as $row) { if ($row['scope'] == 'global') { $this->globalOnlyPermissions[] = substr($row['name'], strlen($this->prefix)); } } return $this; } private function getSequence($alternate, $fixed) { $args = func_get_args(); $args[] = new Perms_Check_Direct(); $args[] = new Perms_Check_Indirect($this->adminPermissionMap); return $args; } private function getFactories() { $factories = [ new Perms_ResolverFactory_ObjectFactory() ]; if ($this->categories) { $factories[] = new Perms_ResolverFactory_CategoryFactory(); } $factories[] = new Perms_ResolverFactory_ObjectFactory('parent'); if ($this->categories) { $factories[] = new Perms_ResolverFactory_CategoryFactory('parent'); } $factories[] = new Perms_ResolverFactory_GlobalFactory(); return $factories; } }