# ConfigurableModuleCls

**Kind:** Type

**Source:** [`packages/common/module-utils/interfaces/configurable-module-cls.interface.ts`](https://github.com/nestjs/nest/blob/master/packages/common/module-utils/interfaces/configurable-module-cls.interface.ts#L16)

**Part of:** [Common](subsystem-packages-common)

Class that represents a blueprint/prototype for a configurable Nest module.
This class provides static methods for constructing dynamic modules. Their names
can be controlled through the "MethodKey" type argument.

`ConfigurableModuleCls` describes the class produced by Nest’s configurable module utilities. It defines the static registration methods that create `DynamicModule` definitions, including custom method names such as `forRoot` and `forRootAsync`.

## Definition

```ts
{ new (): any; } & Record< `${MethodKey}`, ( options: ModuleOptions & Partial<ExtraModuleDefinitionOptions>, ) => DynamicModule > & Record< `${MethodKey}Async`, ( options: ConfigurableModuleAsyncOptions< ModuleOptions, FactoryClassMethodKey > & Partial<ExtraModuleDefinitionOptions>, ) => DynamicModule >
```

## Diagram

```mermaid
graph LR
  Builder[ConfigurableModuleBuilder] --> GeneratedClass[ConfigurableModuleCls]
  GeneratedClass --> SyncMethod[forRoot / register]
  GeneratedClass --> AsyncMethod[forRootAsync / registerAsync]
  SyncMethod --> DynamicModule[DynamicModule]
  AsyncMethod --> DynamicModule
  DynamicModule --> NestApp[Nest application imports]
```

## Usage

```ts
import { Module } from '@nestjs/common';
import {
  ConfigurableModuleBuilder,
  ConfigurableModuleCls,
} from '@nestjs/common';

interface CacheModuleOptions {
  ttl: number;
  prefix?: string;
}

const { ConfigurableModuleClass } =
  new ConfigurableModuleBuilder<CacheModuleOptions>()
    .setClassMethodName('forRoot')
    .build();

export class CacheModule extends ConfigurableModuleClass {}

const CacheConfigurableModule: ConfigurableModuleCls<
  CacheModuleOptions,
  'forRoot'
> = CacheModule;

@Module({
  imports: [
    CacheConfigurableModule.forRoot({
      ttl: 60,
      prefix: 'app:',
    }),
  ],
})
export class AppModule {}
```

## AI Coding Instructions

- Use `ConfigurableModuleCls` when a helper, factory, or abstraction needs to accept a generated configurable module class.
- Keep the `MethodKey` generic aligned with the method configured through `setClassMethodName()`, such as `'forRoot'`.
- Prefer extending the generated `ConfigurableModuleClass` when defining the public Nest module class.
- Use the generated synchronous or asynchronous registration method in a module’s `imports` array, since each call returns a `DynamicModule`.
- Do not instantiate configurable module classes directly; use their static registration methods instead.
