# Interface ExtensionContainer

All Known Subinterfaces:
  `Convention`

public interface ExtensionContainer
Allows adding 'namespaced' DSL extensions to a target object.

## Method Summary

Modifier and Type
Method
Description
`<T> void`
`add(Class<T> publicType, String name, T extension)`
Adds a new extension to this container.
`void`
`add(String name, Object extension)`
Adds a new extension to this container.
`<T> void`
`add(TypeOf<T> publicType, String name, T extension)`
Adds a new extension to this container.
`<T> void`
`configure(Class<T> type, Action<? super T> action)`
Looks for the extension of the specified type and configures it with the supplied action.
`<T> void`
`configure(String name, Action<? super T> action)`
Looks for the extension with the specified name and configures it with the supplied action.
`<T> void`
`configure(TypeOf<T> type, Action<? super T> action)`
Looks for the extension of the specified type and configures it with the supplied action.
`<T> T`
`create(Class<T> publicType, String name, Class<? extends T> instanceType, Object... constructionArguments)`
Creates and adds a new extension to this container.
`<T> T`
`create(String name, Class<T> type, Object... constructionArguments)`
Creates and adds a new extension to this container.
`<T> T`
`create(TypeOf<T> publicType, String name, Class<? extends T> instanceType, Object... constructionArguments)`
Creates and adds a new extension to this container.
`Object`
`findByName(String name)`
Looks for the extension of a given name.
`<T> T`
`findByType(Class<T> type)`
Looks for the extension of a given type (useful to avoid casting).
`<T> T`
`findByType(TypeOf<T> type)`
Looks for the extension of a given type (useful to avoid casting).
`Object`
`getByName(String name)`
Looks for the extension of a given name.
`<T> T`
`getByType(Class<T> type)`
Looks for the extension of a given type (useful to avoid casting).
`<T> T`
`getByType(TypeOf<T> type)`
Looks for the extension of a given type (useful to avoid casting).
`ExtraPropertiesExtension`
`getExtraProperties()`
The extra properties extension in this extension container.
`Map<String, TypeOf<?>>`
`getSchema()`
Provides access to all known extensions types.

## Method Details

### add

@Incubating <T> void add(Class<T> publicType, String name, T extension)
Adds a new extension to this container. Adding an extension of name 'foo' will:

- add 'foo' dynamic property
- add 'foo' dynamic method that accepts a closure that is a configuration script block

The extension will be exposed as `publicType`.

Parameters:
  `publicType` - The extension public type
  `name` - The name for the extension
  `extension` - Any object implementing `publicType`
Throws:
  `IllegalArgumentException` - When an extension with the given name already exists.
Since:
  3.5

### add

@Incubating <T> void add(TypeOf<T> publicType, String name, T extension)
Adds a new extension to this container. Adding an extension of name 'foo' will:

- add 'foo' dynamic property
- add 'foo' dynamic method that accepts a closure that is a configuration script block

The extension will be exposed as `publicType`.

Parameters:
  `publicType` - The extension public type
  `name` - The name for the extension
  `extension` - Any object implementing `publicType`
Throws:
  `IllegalArgumentException` - When an extension with the given name already exists.
Since:
  3.5

### add

void add(String name, Object extension)
Adds a new extension to this container. Adding an extension of name 'foo' will:

- add 'foo' dynamic property
- add 'foo' dynamic method that accepts a closure that is a configuration script block

The extension will be exposed as `extension.getClass()` unless the extension itself declares a preferred public type via the `HasPublicType` protocol.

Parameters:
  `name` - The name for the extension
  `extension` - Any object
Throws:
  `IllegalArgumentException` - When an extension with the given name already exists

### create

@Incubating <T> T create(Class<T> publicType, String name, Class<? extends T> instanceType, Object... constructionArguments)
Creates and adds a new extension to this container. A new instance of the given `instanceType` will be created using the given `constructionArguments`. The extension will be exposed as `publicType`. The new instance will have been dynamically made `ExtensionAware`, which means that you can cast it to `ExtensionAware`.

Type Parameters:
  `T` - the extension public type
Parameters:
  `publicType` - The extension public type
  `name` - The name for the extension
  `instanceType` - The extension instance type
  `constructionArguments` - The arguments to be used to construct the extension instance
Returns:
  The created instance
Throws:
  `IllegalArgumentException` - When an extension with the given name already exists.
Since:
  3.5
See Also:
  - `add(Class, String, Object)`

### create

@Incubating <T> T create(TypeOf<T> publicType, String name, Class<? extends T> instanceType, Object... constructionArguments)
Creates and adds a new extension to this container. A new instance of the given `instanceType` will be created using the given `constructionArguments`. The extension will be exposed as `publicType`. The new instance will have been dynamically made `ExtensionAware`, which means that you can cast it to `ExtensionAware`.

Type Parameters:
  `T` - the extension public type
Parameters:
  `publicType` - The extension public type
  `name` - The name for the extension
  `instanceType` - The extension instance type
  `constructionArguments` - The arguments to be used to construct the extension instance
Returns:
  The created instance
Throws:
  `IllegalArgumentException` - When an extension with the given name already exists.
Since:
  3.5
See Also:
  - `add(Class, String, Object)`

### create

<T> T create(String name, Class<T> type, Object... constructionArguments)
Creates and adds a new extension to this container. A new instance of the given `type` will be created using the given `constructionArguments`. The extension will be exposed as `type` unless the extension itself declares a preferred public type via the `HasPublicType` protocol. The new instance will have been dynamically made `ExtensionAware`, which means that you can cast it to `ExtensionAware`.

Parameters:
  `name` - The name for the extension
  `type` - The type of the extension
  `constructionArguments` - The arguments to be used to construct the extension instance
Returns:
  The created instance
Throws:
  `IllegalArgumentException` - When an extension with the given name already exists.
See Also:
  - `add(String, Object)`

### getSchema

@Incubating Map<String, TypeOf<?>> getSchema()
Provides access to all known extensions types.

Returns:
  A map of extensions public types, keyed by name
Since:
  3.5

### getByType

<T> T getByType(Class<T> type) throws UnknownDomainObjectException
Looks for the extension of a given type (useful to avoid casting). If none found it will throw an exception.

Parameters:
  `type` - extension type
Returns:
  extension, never null
Throws:
  `UnknownDomainObjectException` - When the given extension is not found.

### getByType

@Incubating <T> T getByType(TypeOf<T> type) throws UnknownDomainObjectException
Looks for the extension of a given type (useful to avoid casting). If none found it will throw an exception.

Parameters:
  `type` - extension type
Returns:
  extension, never null
Throws:
  `UnknownDomainObjectException` - When the given extension is not found.
Since:
  3.5

### findByType

@Nullable <T> T findByType(Class<T> type)
Looks for the extension of a given type (useful to avoid casting). If none found null is returned.

Parameters:
  `type` - extension type
Returns:
  extension or null

### findByType

@Incubating @Nullable <T> T findByType(TypeOf<T> type)
Looks for the extension of a given type (useful to avoid casting). If none found null is returned.

Parameters:
  `type` - extension type
Returns:
  extension or null
Since:
  3.5

### getByName

Object getByName(String name) throws UnknownDomainObjectException
Looks for the extension of a given name. If none found it will throw an exception.

Parameters:
  `name` - extension name
Returns:
  extension, never null
Throws:
  `UnknownDomainObjectException` - When the given extension is not found.

### findByName

@Nullable Object findByName(String name)
Looks for the extension of a given name. If none found null is returned.

Parameters:
  `name` - extension name
Returns:
  extension or null

### configure

@Incubating <T> void configure(Class<T> type, Action<? super T> action)
Looks for the extension of the specified type and configures it with the supplied action.

Parameters:
  `type` - extension type
  `action` - the configure action
Throws:
  `UnknownDomainObjectException` - if no extension is found.

### configure

@Incubating <T> void configure(TypeOf<T> type, Action<? super T> action)
Looks for the extension of the specified type and configures it with the supplied action.

Parameters:
  `type` - extension type
  `action` - the configure action
Throws:
  `UnknownDomainObjectException` - if no extension is found.
Since:
  3.5

### configure

@Incubating <T> void configure(String name, Action<? super T> action)
Looks for the extension with the specified name and configures it with the supplied action.

Parameters:
  `name` - extension name
  `action` - the configure action
Throws:
  `UnknownDomainObjectException` - if no extension is found.
Since:
  4.0

### getExtraProperties

ExtraPropertiesExtension getExtraProperties()
The extra properties extension in this extension container. This extension is always present in the container, with the name “ext”.

Returns:
  The extra properties extension in this extension container.