# Interface ExtensionContainer

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.
  `@Nullable Object`
  `findByName(String name)`
  Looks for the extension of a given name.
  `<T> @Nullable T`
  `findByType(Class<T> type)`
  Looks for the extension of a given type (useful to avoid casting).
  `<T> @Nullable 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).
  `ExtensionsSchema`
  `getExtensionsSchema()`
  Provides access to the schema of all known extensions.
  `ExtraPropertiesExtension`
  `getExtraProperties()`
  The extra properties extension in this extension container.

- ## Method Details

  - ### add

    <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

    <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

    <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

    <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)`

  - ### getExtensionsSchema

    ExtensionsSchema getExtensionsSchema()
    Provides access to the schema of all known extensions.
    Since:
      4.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

    <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

    <T> @Nullable 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

    <T> @Nullable 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

    <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

    <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

    <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.