MVCHandler.java
0001 /*
0002  * Copyright 2008-2017 the original author or authors.
0003  *
0004  * Licensed under the Apache License, Version 2.0 (the "License");
0005  * you may not use this file except in compliance with the License.
0006  * You may obtain a copy of the License at
0007  *
0008  *     http://www.apache.org/licenses/LICENSE-2.0
0009  *
0010  * Unless required by applicable law or agreed to in writing, software
0011  * distributed under the License is distributed on an "AS IS" BASIS,
0012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
0013  * See the License for the specific language governing permissions and
0014  * limitations under the License.
0015  */
0016 package griffon.core.mvc;
0017 
0018 import griffon.core.artifact.GriffonController;
0019 import griffon.core.artifact.GriffonModel;
0020 import griffon.core.artifact.GriffonMvcArtifact;
0021 import griffon.core.artifact.GriffonView;
0022 
0023 import javax.annotation.Nonnull;
0024 import java.util.List;
0025 import java.util.Map;
0026 
0027 /**
0028  * Base contract for classes that can manipulate MVC groups.
0029  * There are 4 types of methods used for instantiating a group:
0030  * <ul>
0031  * <ol>{@code createMVCGroup()} - creates a new group instance returning all members.</ol>
0032  * <ol>{@code createMVC()} - creates a new group instance returning only Model, View and Controller members.</ol>
0033  * <ol>{@code withMVCGroup()} - creates a new group instance and destroys it immediately after it has been processed by the callback.</ol>
0034  * <ol>{@code withMVC()} - creates a new group instance and destroys it immediately after it has been processed by the callback.</ol>
0035  * </ul>
0036  * <p/>
0037  * It's worth mentioning that the value of the {@code mvcId} parameter must be unique otherwise a collision will occur.
0038  * When that happens the application will report and exception and terminate. This behavior can be configured to be more
0039  * lenient, by defining a configuration flag {@code griffon.mvcid.collision} in {@code Config}. <br/>
0040  * Accepted values are
0041  * <ul>
0042  * <ol>warning - reports the error but allows the application to continue. Destroys the existing group before continuing.</ol>
0043  * <ol>exception - reports the error and terminates the application. this is the default behavior.</ol>
0044  * </ul>
0045  *
0046  * @author Andres Almiray
0047  * @since 2.0.0
0048  */
0049 public interface MVCHandler {
0050     /**
0051      * Instantiates an MVC group of the specified type.<p>
0052      * MVC groups must be previously configured with the application's metadata
0053      * before they can be used. This registration process usually takes place automatically
0054      * at boot time. The type of the group can be normally found in the application's
0055      * configuration file.<p>
0056      * For example, with the following entry available in {@code Config.groovy}
0057      * <p/>
0058      * <pre>
0059      * mvcGroups {
0060      *     foo {
0061      *         model      = 'com.acme.FooModel'
0062      *         view       = 'com.acme.FooView'
0063      *         controller = 'com.acme.FooController'
0064      *     }
0065      * }
0066      * </pre>
0067      * <p/>
0068      * An instance of the "foo" group can be created as follows
0069      * <p/>
0070      * <pre>
0071      * MVCGroup fooGroup = createMVCGroup('foo')
0072      * assert (fooGroup.controller instanceof FooController)
0073      * </pre>
0074      *
0075      * @param mvcType the type of group to build.
0076      *
0077      * @return an MVCGroup instance of the desired type
0078      *
0079      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0080      *                                                           configuration or if a group with the same mvcId exists already.
0081      */
0082     @Nonnull
0083     MVCGroup createMVCGroup(@Nonnull String mvcType);
0084 
0085     /**
0086      * Instantiates an MVC group of the specified type with a particular name.<p>
0087      * MVC groups must be previously configured with the application's metadata
0088      * before they can be used. This registration process usually takes place automatically
0089      * at boot time. The type of the group can be normally found in the application's
0090      * configuration file.<p>
0091      * For example, with the following entry available in {@code Config.groovy}
0092      * <p/>
0093      * <pre>
0094      * mvcGroups {
0095      *     foo {
0096      *         model      = 'com.acme.FooModel'
0097      *         view       = 'com.acme.FooView'
0098      *         controller = 'com.acme.FooController'
0099      *     }
0100      * }
0101      * </pre>
0102      * <p/>
0103      * An instance of the "foo" group can be created as follows
0104      * <p/>
0105      * <pre>
0106      * MVCGroup fooGroup = createMVCGroup('foo', 'foo' + System.currentTimeMillis())
0107      * assert (fooGroup.controller instanceof FooController)
0108      * </pre>
0109      * <p/>
0110      * MVC groups must have an unique name.
0111      *
0112      * @param mvcType the type of group to build.
0113      * @param mvcId   the name to assign to the built group.
0114      *
0115      * @return an MVCGroup instance of the desired type
0116      *
0117      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0118      *                                                           configuration or if a group with the same mvcId exists already.
0119      */
0120     @Nonnull
0121     MVCGroup createMVCGroup(@Nonnull String mvcType, @Nonnull String mvcId);
0122 
0123     /**
0124      * Instantiates an MVC group of the specified type with additional variables.<p>
0125      * MVC groups must be previously configured with the application's metadata
0126      * before they can be used. This registration process usually takes place automatically
0127      * at boot time. The type of the group can be normally found in the application's
0128      * configuration file.<p>
0129      * The <tt>args</tt> Map can contain any value that will be used in one of the following
0130      * scenarios <ul>
0131      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
0132      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
0133      * on any MVC member of the group.</li>
0134      * </ul>
0135      * <p/>
0136      * For example, with the following entry available in {@code Config.groovy}
0137      * <p/>
0138      * <pre>
0139      * mvcGroups {
0140      *     foo {
0141      *         model      = 'com.acme.FooModel'
0142      *         view       = 'com.acme.FooView'
0143      *         controller = 'com.acme.FooController'
0144      *     }
0145      *     bar {
0146      *         model      = 'com.acme.FooModel'
0147      *         view       = 'com.acme.BarView'
0148      *         controller = 'com.acme.BarController'
0149      *     }
0150      * }
0151      * </pre>
0152      * <p/>
0153      * Notice that groups "foo" and "bar share the same model type, We can make them share the same model
0154      * instance by creating the groups in the following way:
0155      * <p/>
0156      * <pre>
0157      * MVCGroup fooGroup = createMVCGroup('foo')
0158      * MVCGroup barGroup = createMVCGroup('bar', model: fooGroup.model)
0159      * assert fooGroup.model == barGroup.model
0160      * </pre>
0161      *
0162      * @param args    any useful values that can be set as properties on each MVC member or that
0163      *                identify a member that can be shared with other groups.
0164      * @param mvcType the type of group to build.
0165      *
0166      * @return an MVCGroup instance of the desired type
0167      *
0168      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0169      *                                                           configuration or if a group with the same mvcId exists already.
0170      */
0171     @Nonnull
0172     MVCGroup createMVCGroup(@Nonnull Map<String, Object> args, @Nonnull String mvcType);
0173 
0174     /**
0175      * Instantiates an MVC group of the specified type with additional variables.<p>
0176      * MVC groups must be previously configured with the application's metadata
0177      * before they can be used. This registration process usually takes place automatically
0178      * at boot time. The type of the group can be normally found in the application's
0179      * configuration file.<p>
0180      * The <tt>args</tt> Map can contain any value that will be used in one of the following
0181      * scenarios <ul>
0182      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
0183      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
0184      * on any MVC member of the group.</li>
0185      * </ul>
0186      * <p/>
0187      * For example, with the following entry available in {@code Config.groovy}
0188      * <p/>
0189      * <pre>
0190      * mvcGroups {
0191      *     foo {
0192      *         model      = 'com.acme.FooModel'
0193      *         view       = 'com.acme.FooView'
0194      *         controller = 'com.acme.FooController'
0195      *     }
0196      *     bar {
0197      *         model      = 'com.acme.FooModel'
0198      *         view       = 'com.acme.BarView'
0199      *         controller = 'com.acme.BarController'
0200      *     }
0201      * }
0202      * </pre>
0203      * <p/>
0204      * Notice that groups "foo" and "bar share the same model type, We can make them share the same model
0205      * instance by creating the groups in the following way:
0206      * <p/>
0207      * <pre>
0208      * MVCGroup fooGroup = createMVCGroup('foo')
0209      * MVCGroup barGroup = createMVCGroup('bar', model: fooGroup.model)
0210      * assert fooGroup.model == barGroup.model
0211      * </pre>
0212      *
0213      * @param mvcType the type of group to build.
0214      * @param args    any useful values that can be set as properties on each MVC member or that
0215      *                identify a member that can be shared with other groups.
0216      *
0217      * @return an MVCGroup instance of the desired type
0218      *
0219      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0220      *                                                           configuration or if a group with the same mvcId exists already.
0221      */
0222     @Nonnull
0223     MVCGroup createMVCGroup(@Nonnull String mvcType, @Nonnull Map<String, Object> args);
0224 
0225     /**
0226      * Instantiates an MVC group of the specified type with a particular name.<p>
0227      * MVC groups must be previously configured with the application's metadata
0228      * before they can be used. This registration process usually takes place automatically
0229      * at boot time. The type of the group can be normally found in the application's
0230      * configuration file.<p>
0231      * The <tt>args</tt> Map can contain any value that will be used in one of the following
0232      * scenarios <ul>
0233      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
0234      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
0235      * on any MVC member of the group.</li>
0236      * </ul>
0237      * <p/>
0238      * For example, with the following entry available in {@code Config.groovy}
0239      * <p/>
0240      * <pre>
0241      * mvcGroups {
0242      *     foo {
0243      *         model      = 'com.acme.FooModel'
0244      *         view       = 'com.acme.FooView'
0245      *         controller = 'com.acme.FooController'
0246      *     }
0247      * }
0248      * </pre>
0249      * <p/>
0250      * We can create two instances of the same group that share the same model instance in the following way:
0251      * <p/>
0252      * <pre>
0253      * MVCGroup fooGroup1 = createMVCGroup('foo', 'foo1')
0254      * MVCGroup fooGroup2 = createMVCGroup('foo', 'foo2', model: fooGroup1.model)
0255      * assert fooGroup1.model == fooGroup2.model
0256      * </pre>
0257      * <p/>
0258      * MVC groups must have an unique name.
0259      *
0260      * @param args    any useful values that can be set as properties on each MVC member or that
0261      *                identify a member that can be shared with other groups.
0262      * @param mvcType the type of group to build.
0263      * @param mvcId   the name to assign to the built group.
0264      *
0265      * @return an MVCGroup instance of the desired type
0266      *
0267      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0268      *                                                           configuration or if a group with the same mvcId exists already.
0269      */
0270     @Nonnull
0271     MVCGroup createMVCGroup(@Nonnull Map<String, Object> args, @Nonnull String mvcType, @Nonnull String mvcId);
0272 
0273     /**
0274      * Instantiates an MVC group of the specified type with a particular name.<p>
0275      * MVC groups must be previously configured with the application's metadata
0276      * before they can be used. This registration process usually takes place automatically
0277      * at boot time. The type of the group can be normally found in the application's
0278      * configuration file.<p>
0279      * The <tt>args</tt> Map can contain any value that will be used in one of the following
0280      * scenarios <ul>
0281      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
0282      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
0283      * on any MVC member of the group.</li>
0284      * </ul>
0285      * <p/>
0286      * For example, with the following entry available in {@code Config.groovy}
0287      * <p/>
0288      * <pre>
0289      * mvcGroups {
0290      *     foo {
0291      *         model      = 'com.acme.FooModel'
0292      *         view       = 'com.acme.FooView'
0293      *         controller = 'com.acme.FooController'
0294      *     }
0295      * }
0296      * </pre>
0297      * <p/>
0298      * We can create two instances of the same group that share the same model instance in the following way:
0299      * <p/>
0300      * <pre>
0301      * MVCGroup fooGroup1 = createMVCGroup('foo', 'foo1')
0302      * MVCGroup fooGroup2 = createMVCGroup('foo', 'foo2', model: fooGroup1.model)
0303      * assert fooGroup1.model == fooGroup2.model
0304      * </pre>
0305      * <p/>
0306      * MVC groups must have an unique name.
0307      *
0308      * @param mvcType the type of group to build.
0309      * @param mvcId   the name to assign to the built group.
0310      * @param args    any useful values that can be set as properties on each MVC member or that
0311      *                identify a member that can be shared with other groups.
0312      *
0313      * @return an MVCGroup instance of the desired type
0314      *
0315      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0316      *                                                           configuration or if a group with the same mvcId exists already.
0317      */
0318     @Nonnull
0319     MVCGroup createMVCGroup(@Nonnull String mvcType, @Nonnull String mvcId, @Nonnull Map<String, Object> args);
0320 
0321     /**
0322      * Instantiates an MVC group of the specified type.<p>
0323      * MVC groups must be previously configured with the application's metadata
0324      * before they can be used. This registration process usually takes place automatically
0325      * at boot time. The type of the group can be normally found in the application's
0326      * configuration file.<p>
0327      * For example, with the following entry available in {@code Config.groovy}
0328      * <p/>
0329      * <pre>
0330      * mvcGroups {
0331      *     foo {
0332      *         model      = 'com.acme.FooModel'
0333      *         view       = 'com.acme.FooView'
0334      *         controller = 'com.acme.FooController'
0335      *     }
0336      * }
0337      * </pre>
0338      * <p/>
0339      * An instance of the "foo" group can be created as follows
0340      * <p/>
0341      * <pre>
0342      * FooMVCGroup fooGroup = createMVCGroup(FooMVCGroup)
0343      * assert (fooGroup.controller instanceof FooController)
0344      * </pre>
0345      *
0346      * @param mvcType the type of group to build.
0347      *
0348      * @return an MVCGroup instance of the desired type
0349      *
0350      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0351      *                                                           configuration or if a group with the same mvcId exists already.
0352      * @since 2.11.0
0353      */
0354     @Nonnull
0355     <MVC extends TypedMVCGroup> MVC createMVCGroup(@Nonnull Class<? extends MVC> mvcType);
0356 
0357     /**
0358      * Instantiates an MVC group of the specified type with a particular name.<p>
0359      * MVC groups must be previously configured with the application's metadata
0360      * before they can be used. This registration process usually takes place automatically
0361      * at boot time. The type of the group can be normally found in the application's
0362      * configuration file.<p>
0363      * For example, with the following entry available in {@code Config.groovy}
0364      * <p/>
0365      * <pre>
0366      * mvcGroups {
0367      *     foo {
0368      *         model      = 'com.acme.FooModel'
0369      *         view       = 'com.acme.FooView'
0370      *         controller = 'com.acme.FooController'
0371      *     }
0372      * }
0373      * </pre>
0374      * <p/>
0375      * An instance of the "foo" group can be created as follows
0376      * <p/>
0377      * <pre>
0378      * FooMVCGroup fooGroup = createMVCGroup(FooMVCGroup, 'foo' + System.currentTimeMillis())
0379      * assert (fooGroup.controller instanceof FooController)
0380      * </pre>
0381      * <p/>
0382      * MVC groups must have an unique name.
0383      *
0384      * @param mvcType the type of group to build.
0385      * @param mvcId   the name to assign to the built group.
0386      *
0387      * @return an MVCGroup instance of the desired type
0388      *
0389      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0390      *                                                           configuration or if a group with the same mvcId exists already.
0391      * @since 2.11.0
0392      */
0393     @Nonnull
0394     <MVC extends TypedMVCGroup> MVC createMVCGroup(@Nonnull Class<? extends MVC> mvcType, @Nonnull String mvcId);
0395 
0396     /**
0397      * Instantiates an MVC group of the specified type with additional variables.<p>
0398      * MVC groups must be previously configured with the application's metadata
0399      * before they can be used. This registration process usually takes place automatically
0400      * at boot time. The type of the group can be normally found in the application's
0401      * configuration file.<p>
0402      * The <tt>args</tt> Map can contain any value that will be used in one of the following
0403      * scenarios <ul>
0404      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
0405      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
0406      * on any MVC member of the group.</li>
0407      * </ul>
0408      * <p/>
0409      * For example, with the following entry available in {@code Config.groovy}
0410      * <p/>
0411      * <pre>
0412      * mvcGroups {
0413      *     foo {
0414      *         model      = 'com.acme.FooModel'
0415      *         view       = 'com.acme.FooView'
0416      *         controller = 'com.acme.FooController'
0417      *     }
0418      *     bar {
0419      *         model      = 'com.acme.FooModel'
0420      *         view       = 'com.acme.BarView'
0421      *         controller = 'com.acme.BarController'
0422      *     }
0423      * }
0424      * </pre>
0425      * <p/>
0426      * Notice that groups "foo" and "bar share the same model type, We can make them share the same model
0427      * instance by creating the groups in the following way:
0428      * <p/>
0429      * <pre>
0430      * FooMVCGroup fooGroup = createMVCGroup(FooMVCGroup)
0431      * BarMVCGroup barGroup = createMVCGroup(BarMVCGroup, model: fooGroup.model)
0432      * assert fooGroup.model == barGroup.model
0433      * </pre>
0434      *
0435      * @param args    any useful values that can be set as properties on each MVC member or that
0436      *                identify a member that can be shared with other groups.
0437      * @param mvcType the type of group to build.
0438      *
0439      * @return an MVCGroup instance of the desired type
0440      *
0441      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0442      *                                                           configuration or if a group with the same mvcId exists already.
0443      * @since 2.11.0
0444      */
0445     @Nonnull
0446     <MVC extends TypedMVCGroup> MVC createMVCGroup(@Nonnull Map<String, Object> args, @Nonnull Class<? extends MVC> mvcType);
0447 
0448     /**
0449      * Instantiates an MVC group of the specified type with additional variables.<p>
0450      * MVC groups must be previously configured with the application's metadata
0451      * before they can be used. This registration process usually takes place automatically
0452      * at boot time. The type of the group can be normally found in the application's
0453      * configuration file.<p>
0454      * The <tt>args</tt> Map can contain any value that will be used in one of the following
0455      * scenarios <ul>
0456      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
0457      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
0458      * on any MVC member of the group.</li>
0459      * </ul>
0460      * <p/>
0461      * For example, with the following entry available in {@code Config.groovy}
0462      * <p/>
0463      * <pre>
0464      * mvcGroups {
0465      *     foo {
0466      *         model      = 'com.acme.FooModel'
0467      *         view       = 'com.acme.FooView'
0468      *         controller = 'com.acme.FooController'
0469      *     }
0470      *     bar {
0471      *         model      = 'com.acme.FooModel'
0472      *         view       = 'com.acme.BarView'
0473      *         controller = 'com.acme.BarController'
0474      *     }
0475      * }
0476      * </pre>
0477      * <p/>
0478      * Notice that groups "foo" and "bar share the same model type, We can make them share the same model
0479      * instance by creating the groups in the following way:
0480      * <p/>
0481      * <pre>
0482      * FooMVCGroup fooGroup = createMVCGroup(FooMVCGroup)
0483      * BarMVCGroup barGroup = createMVCGroup(BarMVCGroup, model: fooGroup.model)
0484      * assert fooGroup.model == barGroup.model
0485      * </pre>
0486      *
0487      * @param mvcType the type of group to build.
0488      * @param args    any useful values that can be set as properties on each MVC member or that
0489      *                identify a member that can be shared with other groups.
0490      *
0491      * @return an MVCGroup instance of the desired type
0492      *
0493      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0494      *                                                           configuration or if a group with the same mvcId exists already.
0495      * @since 2.11.0
0496      */
0497     @Nonnull
0498     <MVC extends TypedMVCGroup> MVC createMVCGroup(@Nonnull Class<? extends MVC> mvcType, @Nonnull Map<String, Object> args);
0499 
0500     /**
0501      * Instantiates an MVC group of the specified type with a particular name.<p>
0502      * MVC groups must be previously configured with the application's metadata
0503      * before they can be used. This registration process usually takes place automatically
0504      * at boot time. The type of the group can be normally found in the application's
0505      * configuration file.<p>
0506      * The <tt>args</tt> Map can contain any value that will be used in one of the following
0507      * scenarios <ul>
0508      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
0509      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
0510      * on any MVC member of the group.</li>
0511      * </ul>
0512      * <p/>
0513      * For example, with the following entry available in {@code Config.groovy}
0514      * <p/>
0515      * <pre>
0516      * mvcGroups {
0517      *     foo {
0518      *         model      = 'com.acme.FooModel'
0519      *         view       = 'com.acme.FooView'
0520      *         controller = 'com.acme.FooController'
0521      *     }
0522      * }
0523      * </pre>
0524      * <p/>
0525      * We can create two instances of the same group that share the same model instance in the following way:
0526      * <p/>
0527      * <pre>
0528      * FooMVCGroup fooGroup1 = createMVCGroup(FooMVCGroup, 'foo1')
0529      * FooMVCGroup fooGroup2 = createMVCGroup(FooMVCGroup, 'foo2', model: fooGroup1.model)
0530      * assert fooGroup1.model == fooGroup2.model
0531      * </pre>
0532      * <p/>
0533      * MVC groups must have an unique name.
0534      *
0535      * @param args    any useful values that can be set as properties on each MVC member or that
0536      *                identify a member that can be shared with other groups.
0537      * @param mvcType the type of group to build.
0538      * @param mvcId   the name to assign to the built group.
0539      *
0540      * @return an MVCGroup instance of the desired type
0541      *
0542      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0543      *                                                           configuration or if a group with the same mvcId exists already.
0544      * @since 2.11.0
0545      */
0546     @Nonnull
0547     <MVC extends TypedMVCGroup> MVC createMVCGroup(@Nonnull Map<String, Object> args, @Nonnull Class<? extends MVC> mvcType, @Nonnull String mvcId);
0548 
0549     /**
0550      * Instantiates an MVC group of the specified type with a particular name.<p>
0551      * MVC groups must be previously configured with the application's metadata
0552      * before they can be used. This registration process usually takes place automatically
0553      * at boot time. The type of the group can be normally found in the application's
0554      * configuration file.<p>
0555      * The <tt>args</tt> Map can contain any value that will be used in one of the following
0556      * scenarios <ul>
0557      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
0558      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
0559      * on any MVC member of the group.</li>
0560      * </ul>
0561      * <p/>
0562      * For example, with the following entry available in {@code Config.groovy}
0563      * <p/>
0564      * <pre>
0565      * mvcGroups {
0566      *     foo {
0567      *         model      = 'com.acme.FooModel'
0568      *         view       = 'com.acme.FooView'
0569      *         controller = 'com.acme.FooController'
0570      *     }
0571      * }
0572      * </pre>
0573      * <p/>
0574      * We can create two instances of the same group that share the same model instance in the following way:
0575      * <p/>
0576      * <pre>
0577      * FooMVCGroup fooGroup1 = createMVCGroup(FooMVCGroup, 'foo1')
0578      * FooMVCGroup fooGroup2 = createMVCGroup(FooMVCGroup, 'foo2', model: fooGroup1.model)
0579      * assert fooGroup1.model == fooGroup2.model
0580      * </pre>
0581      * <p/>
0582      * MVC groups must have an unique name.
0583      *
0584      * @param mvcType the type of group to build.
0585      * @param mvcId   the name to assign to the built group.
0586      * @param args    any useful values that can be set as properties on each MVC member or that
0587      *                identify a member that can be shared with other groups.
0588      *
0589      * @return an MVCGroup instance of the desired type
0590      *
0591      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0592      *                                                           configuration or if a group with the same mvcId exists already.
0593      * @since 2.11.0
0594      */
0595     @Nonnull
0596     <MVC extends TypedMVCGroup> MVC createMVCGroup(@Nonnull Class<? extends MVC> mvcType, @Nonnull String mvcId, @Nonnull Map<String, Object> args);
0597 
0598     /**
0599      * Instantiates an MVC group of the specified type returning only the MVC parts.<p>
0600      * MVC groups must be previously configured with the application's metadata
0601      * before they can be used. This registration process usually takes place automatically
0602      * at boot time. The type of the group can be normally found in the application's
0603      * configuration file.<p>
0604      * For example, with the following entry available in {@code Config.groovy}
0605      * <p/>
0606      * <pre>
0607      * mvcGroups {
0608      *     foo {
0609      *         model      = 'com.acme.FooModel'
0610      *         view       = 'com.acme.FooView'
0611      *         controller = 'com.acme.FooController'
0612      *     }
0613      * }
0614      * </pre>
0615      * <p/>
0616      * An instance of the "foo" group can be created as follows
0617      * <p/>
0618      * <pre>
0619      * def (m, v, c) = createMVC('foo')
0620      * assert (c instanceof FooController)
0621      * </pre>
0622      *
0623      * @param mvcType the type of group to build.
0624      *
0625      * @return a List with the canonical MVC members of the group
0626      *
0627      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0628      *                                                           configuration or if a group with the same mvcId exists already.
0629      */
0630     @Nonnull
0631     List<? extends GriffonMvcArtifact> createMVC(@Nonnull String mvcType);
0632 
0633     /**
0634      * Instantiates an MVC group of the specified type with additional variables.<p>
0635      * MVC groups must be previously configured with the application's metadata
0636      * before they can be used. This registration process usually takes place automatically
0637      * at boot time. The type of the group can be normally found in the application's
0638      * configuration file.<p>
0639      * The <tt>args</tt> Map can contain any value that will be used in one of the following
0640      * scenarios <ul>
0641      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
0642      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
0643      * on any MVC member of the group.</li>
0644      * </ul>
0645      * <p/>
0646      * For example, with the following entry available in {@code Config.groovy}
0647      * <p/>
0648      * <pre>
0649      * mvcGroups {
0650      *     foo {
0651      *         model      = 'com.acme.FooModel'
0652      *         view       = 'com.acme.FooView'
0653      *         controller = 'com.acme.FooController'
0654      *     }
0655      *     bar {
0656      *         model      = 'com.acme.FooModel'
0657      *         view       = 'com.acme.BarView'
0658      *         controller = 'com.acme.BarController'
0659      *     }
0660      * }
0661      * </pre>
0662      * <p/>
0663      * Notice that groups "foo" and "bar share the same model type, We can make them share the same model
0664      * instance by creating the groups in the following way:
0665      * <p/>
0666      * <pre>
0667      * def (m1, v1, c1) = createMVC('foo')
0668      * def (m2, v2, c2) = createMVC('bar', model: m1)
0669      * assert fm1 == m2
0670      * </pre>
0671      *
0672      * @param args    any useful values that can be set as properties on each MVC member or that
0673      *                identify a member that can be shared with other groups.
0674      * @param mvcType the type of group to build.
0675      *
0676      * @return a List with the canonical MVC members of the group
0677      *
0678      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0679      *                                                           configuration or if a group with the same mvcId exists already.
0680      */
0681     @Nonnull
0682     List<? extends GriffonMvcArtifact> createMVC(@Nonnull Map<String, Object> args, @Nonnull String mvcType);
0683 
0684     /**
0685      * Instantiates an MVC group of the specified type with additional variables.<p>
0686      * MVC groups must be previously configured with the application's metadata
0687      * before they can be used. This registration process usually takes place automatically
0688      * at boot time. The type of the group can be normally found in the application's
0689      * configuration file.<p>
0690      * The <tt>args</tt> Map can contain any value that will be used in one of the following
0691      * scenarios <ul>
0692      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
0693      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
0694      * on any MVC member of the group.</li>
0695      * </ul>
0696      * <p/>
0697      * For example, with the following entry available in {@code Config.groovy}
0698      * <p/>
0699      * <pre>
0700      * mvcGroups {
0701      *     foo {
0702      *         model      = 'com.acme.FooModel'
0703      *         view       = 'com.acme.FooView'
0704      *         controller = 'com.acme.FooController'
0705      *     }
0706      *     bar {
0707      *         model      = 'com.acme.FooModel'
0708      *         view       = 'com.acme.BarView'
0709      *         controller = 'com.acme.BarController'
0710      *     }
0711      * }
0712      * </pre>
0713      * <p/>
0714      * Notice that groups "foo" and "bar share the same model type, We can make them share the same model
0715      * instance by creating the groups in the following way:
0716      * <p/>
0717      * <pre>
0718      * def (m1, v1, c1) = createMVC('foo')
0719      * def (m2, v2, c2) = createMVC('bar', model: m1)
0720      * assert fm1 == m2
0721      * </pre>
0722      *
0723      * @param mvcType the type of group to build.
0724      * @param args    any useful values that can be set as properties on each MVC member or that
0725      *                identify a member that can be shared with other groups.
0726      *
0727      * @return a List with the canonical MVC members of the group
0728      *
0729      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0730      *                                                           configuration or if a group with the same mvcId exists already.
0731      */
0732     @Nonnull
0733     List<? extends GriffonMvcArtifact> createMVC(@Nonnull String mvcType, @Nonnull Map<String, Object> args);
0734 
0735     /**
0736      * Instantiates an MVC group of the specified type with a particular name.<p>
0737      * MVC groups must be previously configured with the application's metadata
0738      * before they can be used. This registration process usually takes place automatically
0739      * at boot time. The type of the group can be normally found in the application's
0740      * configuration file.<p>
0741      * For example, with the following entry available in {@code Config.groovy}
0742      * <p/>
0743      * <pre>
0744      * mvcGroups {
0745      *     foo {
0746      *         model      = 'com.acme.FooModel'
0747      *         view       = 'com.acme.FooView'
0748      *         controller = 'com.acme.FooController'
0749      *      }
0750      * }
0751      * </pre>
0752      * <p/>
0753      * An instance of the "foo" group can be created as follows
0754      * <p/>
0755      * <pre>
0756      * def (m, v, c) = createMVC('foo', 'foo' + System.currentTimeMillis())
0757      * assert (c instanceof FooController)
0758      * </pre>
0759      * <p/>
0760      * MVC groups must have an unique name.
0761      *
0762      * @param mvcType the type of group to build.
0763      * @param mvcId   the name to assign to the built group.
0764      *
0765      * @return a List with the canonical MVC members of the group
0766      *
0767      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0768      *                                                           configuration or if a group with the same mvcId exists already.
0769      */
0770     @Nonnull
0771     List<? extends GriffonMvcArtifact> createMVC(@Nonnull String mvcType, @Nonnull String mvcId);
0772 
0773     /**
0774      * Instantiates an MVC group of the specified type with a particular name.<p>
0775      * MVC groups must be previously configured with the application's metadata
0776      * before they can be used. This registration process usually takes place automatically
0777      * at boot time. The type of the group can be normally found in the application's
0778      * configuration file.<p>
0779      * The <tt>args</tt> Map can contain any value that will be used in one of the following
0780      * scenarios <ul>
0781      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
0782      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
0783      * on any MVC member of the group.</li>
0784      * </ul>
0785      * <p/>
0786      * For example, with the following entry available in {@code Config.groovy}
0787      * <p/>
0788      * <pre>
0789      * mvcGroups {
0790      *     foo {
0791      *         model      = 'com.acme.FooModel'
0792      *         view       = 'com.acme.FooView'
0793      *         controller = 'com.acme.FooController'
0794      *     }
0795      * }
0796      * </pre>
0797      * <p/>
0798      * We can create two instances of the same group that share the same model instance in the following way:
0799      * <p/>
0800      * <pre>
0801      * def (m1, v1, c1) = createMVC('foo', 'foo1')
0802      * def (m2, v2, c2) = createMVC('foo', 'foo2', model: m1)
0803      * assert fm1 == m2
0804      * </pre>
0805      * <p/>
0806      * MVC groups must have an unique name.
0807      *
0808      * @param args    any useful values that can be set as properties on each MVC member or that
0809      *                identify a member that can be shared with other groups.
0810      * @param mvcType the type of group to build.
0811      * @param mvcId   the name to assign to the built group.
0812      *
0813      * @return a List with the canonical MVC members of the group
0814      *
0815      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0816      *                                                           configuration or if a group with the same mvcId exists already.
0817      */
0818     @Nonnull
0819     List<? extends GriffonMvcArtifact> createMVC(@Nonnull Map<String, Object> args, @Nonnull String mvcType, @Nonnull String mvcId);
0820 
0821     /**
0822      * Instantiates an MVC group of the specified type with a particular name.<p>
0823      * MVC groups must be previously configured with the application's metadata
0824      * before they can be used. This registration process usually takes place automatically
0825      * at boot time. The type of the group can be normally found in the application's
0826      * configuration file.<p>
0827      * The <tt>args</tt> Map can contain any value that will be used in one of the following
0828      * scenarios <ul>
0829      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
0830      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
0831      * on any MVC member of the group.</li>
0832      * </ul>
0833      * <p/>
0834      * For example, with the following entry available in {@code Config.groovy}
0835      * <p/>
0836      * <pre>
0837      * mvcGroups {
0838      *     foo {
0839      *         model      = 'com.acme.FooModel'
0840      *         view       = 'com.acme.FooView'
0841      *         controller = 'com.acme.FooController'
0842      *     }
0843      * }
0844      * </pre>
0845      * <p/>
0846      * We can create two instances of the same group that share the same model instance in the following way:
0847      * <p/>
0848      * <pre>
0849      * def (m1, v1, c1) = createMVC('foo', 'foo1')
0850      * def (m2, v2, c2) = createMVC('foo', 'foo2', model: m1)
0851      * assert fm1 == m2
0852      * </pre>
0853      * <p/>
0854      * MVC groups must have an unique name.
0855      *
0856      * @param mvcType the type of group to build.
0857      * @param mvcId   the name to assign to the built group.
0858      * @param args    any useful values that can be set as properties on each MVC member or that
0859      *                identify a member that can be shared with other groups.
0860      *
0861      * @return a List with the canonical MVC members of the group
0862      *
0863      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0864      *                                                           configuration or if a group with the same mvcId exists already.
0865      */
0866     @Nonnull
0867     List<? extends GriffonMvcArtifact> createMVC(@Nonnull String mvcType, @Nonnull String mvcId, @Nonnull Map<String, Object> args);
0868 
0869     /**
0870      * Instantiates an MVC group of the specified type returning only the MVC parts.<p>
0871      * MVC groups must be previously configured with the application's metadata
0872      * before they can be used. This registration process usually takes place automatically
0873      * at boot time. The type of the group can be normally found in the application's
0874      * configuration file.<p>
0875      * For example, with the following entry available in {@code Config.groovy}
0876      * <p/>
0877      * <pre>
0878      * mvcGroups {
0879      *     foo {
0880      *         model      = 'com.acme.FooModel'
0881      *         view       = 'com.acme.FooView'
0882      *         controller = 'com.acme.FooController'
0883      *     }
0884      * }
0885      * </pre>
0886      * <p/>
0887      * An instance of the "foo" group can be created as follows
0888      * <p/>
0889      * <pre>
0890      * def (m, v, c) = createMVC(FooMVCGroup)
0891      * assert (c instanceof FooController)
0892      * </pre>
0893      *
0894      * @param mvcType the type of group to build.
0895      *
0896      * @return a List with the canonical MVC members of the group
0897      *
0898      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0899      *                                                           configuration or if a group with the same mvcId exists already.
0900      * @since 2.11.0
0901      */
0902     @Nonnull
0903     <MVC extends TypedMVCGroup> List<? extends GriffonMvcArtifact> createMVC(@Nonnull Class<? extends MVC> mvcType);
0904 
0905     /**
0906      * Instantiates an MVC group of the specified type with additional variables.<p>
0907      * MVC groups must be previously configured with the application's metadata
0908      * before they can be used. This registration process usually takes place automatically
0909      * at boot time. The type of the group can be normally found in the application's
0910      * configuration file.<p>
0911      * The <tt>args</tt> Map can contain any value that will be used in one of the following
0912      * scenarios <ul>
0913      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
0914      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
0915      * on any MVC member of the group.</li>
0916      * </ul>
0917      * <p/>
0918      * For example, with the following entry available in {@code Config.groovy}
0919      * <p/>
0920      * <pre>
0921      * mvcGroups {
0922      *     foo {
0923      *         model      = 'com.acme.FooModel'
0924      *         view       = 'com.acme.FooView'
0925      *         controller = 'com.acme.FooController'
0926      *     }
0927      *     bar {
0928      *         model      = 'com.acme.FooModel'
0929      *         view       = 'com.acme.BarView'
0930      *         controller = 'com.acme.BarController'
0931      *     }
0932      * }
0933      * </pre>
0934      * <p/>
0935      * Notice that groups "foo" and "bar share the same model type, We can make them share the same model
0936      * instance by creating the groups in the following way:
0937      * <p/>
0938      * <pre>
0939      * def (m1, v1, c1) = createMVC(FooMVCGroup)
0940      * def (m2, v2, c2) = createMVC(BarMVCGroup, model: m1)
0941      * assert fm1 == m2
0942      * </pre>
0943      *
0944      * @param args    any useful values that can be set as properties on each MVC member or that
0945      *                identify a member that can be shared with other groups.
0946      * @param mvcType the type of group to build.
0947      *
0948      * @return a List with the canonical MVC members of the group
0949      *
0950      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
0951      *                                                           configuration or if a group with the same mvcId exists already.
0952      * @since 2.11.0
0953      */
0954     @Nonnull
0955     <MVC extends TypedMVCGroup> List<? extends GriffonMvcArtifact> createMVC(@Nonnull Map<String, Object> args, @Nonnull Class<? extends MVC> mvcType);
0956 
0957     /**
0958      * Instantiates an MVC group of the specified type with additional variables.<p>
0959      * MVC groups must be previously configured with the application's metadata
0960      * before they can be used. This registration process usually takes place automatically
0961      * at boot time. The type of the group can be normally found in the application's
0962      * configuration file.<p>
0963      * The <tt>args</tt> Map can contain any value that will be used in one of the following
0964      * scenarios <ul>
0965      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
0966      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
0967      * on any MVC member of the group.</li>
0968      * </ul>
0969      * <p/>
0970      * For example, with the following entry available in {@code Config.groovy}
0971      * <p/>
0972      * <pre>
0973      * mvcGroups {
0974      *     foo {
0975      *         model      = 'com.acme.FooModel'
0976      *         view       = 'com.acme.FooView'
0977      *         controller = 'com.acme.FooController'
0978      *     }
0979      *     bar {
0980      *         model      = 'com.acme.FooModel'
0981      *         view       = 'com.acme.BarView'
0982      *         controller = 'com.acme.BarController'
0983      *     }
0984      * }
0985      * </pre>
0986      * <p/>
0987      * Notice that groups "foo" and "bar share the same model type, We can make them share the same model
0988      * instance by creating the groups in the following way:
0989      * <p/>
0990      * <pre>
0991      * def (m1, v1, c1) = createMVC(FooMVCGroup)
0992      * def (m2, v2, c2) = createMVC(BarMVCGroup, model: m1)
0993      * assert fm1 == m2
0994      * </pre>
0995      *
0996      * @param mvcType the type of group to build.
0997      * @param args    any useful values that can be set as properties on each MVC member or that
0998      *                identify a member that can be shared with other groups.
0999      *
1000      * @return a List with the canonical MVC members of the group
1001      *
1002      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1003      *                                                           configuration or if a group with the same mvcId exists already.
1004      * @since 2.11.0
1005      */
1006     @Nonnull
1007     <MVC extends TypedMVCGroup> List<? extends GriffonMvcArtifact> createMVC(@Nonnull Class<? extends MVC> mvcType, @Nonnull Map<String, Object> args);
1008 
1009     /**
1010      * Instantiates an MVC group of the specified type with a particular name.<p>
1011      * MVC groups must be previously configured with the application's metadata
1012      * before they can be used. This registration process usually takes place automatically
1013      * at boot time. The type of the group can be normally found in the application's
1014      * configuration file.<p>
1015      * For example, with the following entry available in {@code Config.groovy}
1016      * <p/>
1017      * <pre>
1018      * mvcGroups {
1019      *     foo {
1020      *         model      = 'com.acme.FooModel'
1021      *         view       = 'com.acme.FooView'
1022      *         controller = 'com.acme.FooController'
1023      *      }
1024      * }
1025      * </pre>
1026      * <p/>
1027      * An instance of the "foo" group can be created as follows
1028      * <p/>
1029      * <pre>
1030      * def (m, v, c) = createMVC(FooMVCGroup, 'foo' + System.currentTimeMillis())
1031      * assert (c instanceof FooController)
1032      * </pre>
1033      * <p/>
1034      * MVC groups must have an unique name.
1035      *
1036      * @param mvcType the type of group to build.
1037      * @param mvcId   the name to assign to the built group.
1038      *
1039      * @return a List with the canonical MVC members of the group
1040      *
1041      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1042      *                                                           configuration or if a group with the same mvcId exists already.
1043      * @since 2.11.0
1044      */
1045     @Nonnull
1046     <MVC extends TypedMVCGroup> List<? extends GriffonMvcArtifact> createMVC(@Nonnull Class<? extends MVC> mvcType, @Nonnull String mvcId);
1047 
1048     /**
1049      * Instantiates an MVC group of the specified type with a particular name.<p>
1050      * MVC groups must be previously configured with the application's metadata
1051      * before they can be used. This registration process usually takes place automatically
1052      * at boot time. The type of the group can be normally found in the application's
1053      * configuration file.<p>
1054      * The <tt>args</tt> Map can contain any value that will be used in one of the following
1055      * scenarios <ul>
1056      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
1057      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
1058      * on any MVC member of the group.</li>
1059      * </ul>
1060      * <p/>
1061      * For example, with the following entry available in {@code Config.groovy}
1062      * <p/>
1063      * <pre>
1064      * mvcGroups {
1065      *     foo {
1066      *         model      = 'com.acme.FooModel'
1067      *         view       = 'com.acme.FooView'
1068      *         controller = 'com.acme.FooController'
1069      *     }
1070      * }
1071      * </pre>
1072      * <p/>
1073      * We can create two instances of the same group that share the same model instance in the following way:
1074      * <p/>
1075      * <pre>
1076      * def (m1, v1, c1) = createMVC(FooMVCGroup, 'foo1')
1077      * def (m2, v2, c2) = createMVC(FooMVCGroup, 'foo2', model: m1)
1078      * assert fm1 == m2
1079      * </pre>
1080      * <p/>
1081      * MVC groups must have an unique name.
1082      *
1083      * @param args    any useful values that can be set as properties on each MVC member or that
1084      *                identify a member that can be shared with other groups.
1085      * @param mvcType the type of group to build.
1086      * @param mvcId   the name to assign to the built group.
1087      *
1088      * @return a List with the canonical MVC members of the group
1089      *
1090      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1091      *                                                           configuration or if a group with the same mvcId exists already.
1092      * @since 2.11.0
1093      */
1094     @Nonnull
1095     <MVC extends TypedMVCGroup> List<? extends GriffonMvcArtifact> createMVC(@Nonnull Map<String, Object> args, @Nonnull Class<? extends MVC> mvcType, @Nonnull String mvcId);
1096 
1097     /**
1098      * Instantiates an MVC group of the specified type with a particular name.<p>
1099      * MVC groups must be previously configured with the application's metadata
1100      * before they can be used. This registration process usually takes place automatically
1101      * at boot time. The type of the group can be normally found in the application's
1102      * configuration file.<p>
1103      * The <tt>args</tt> Map can contain any value that will be used in one of the following
1104      * scenarios <ul>
1105      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
1106      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
1107      * on any MVC member of the group.</li>
1108      * </ul>
1109      * <p/>
1110      * For example, with the following entry available in {@code Config.groovy}
1111      * <p/>
1112      * <pre>
1113      * mvcGroups {
1114      *     foo {
1115      *         model      = 'com.acme.FooModel'
1116      *         view       = 'com.acme.FooView'
1117      *         controller = 'com.acme.FooController'
1118      *     }
1119      * }
1120      * </pre>
1121      * <p/>
1122      * We can create two instances of the same group that share the same model instance in the following way:
1123      * <p/>
1124      * <pre>
1125      * def (m1, v1, c1) = createMVC(FooMVCGroup, 'foo1')
1126      * def (m2, v2, c2) = createMVC(FooMVCGroup, 'foo2', model: m1)
1127      * assert fm1 == m2
1128      * </pre>
1129      * <p/>
1130      * MVC groups must have an unique name.
1131      *
1132      * @param mvcType the type of group to build.
1133      * @param mvcId   the name to assign to the built group.
1134      * @param args    any useful values that can be set as properties on each MVC member or that
1135      *                identify a member that can be shared with other groups.
1136      *
1137      * @return a List with the canonical MVC members of the group
1138      *
1139      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1140      *                                                           configuration or if a group with the same mvcId exists already.
1141      * @since 2.11.0
1142      */
1143     @Nonnull
1144     <MVC extends TypedMVCGroup> List<? extends GriffonMvcArtifact> createMVC(@Nonnull Class<? extends MVC> mvcType, @Nonnull String mvcId, @Nonnull Map<String, Object> args);
1145 
1146     /**
1147      * Destroys an MVC group identified by a particular name.<p>
1148      * <b>ATTENTION:</b> make sure to call the super implementation if you override this method
1149      * otherwise group references will not be kept up to date.
1150      *
1151      * @param mvcId the name of the group to destroy and dispose.
1152      */
1153     void destroyMVCGroup(@Nonnull String mvcId);
1154 
1155     /**
1156      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1157      * <p>This method is of particular interest when working with short lived MVC groups such as
1158      * those used to build dialogs.<p/>
1159      * <p>MVC groups must be previously configured with the application's metadata
1160      * before they can be used. This registration process usually takes place automatically
1161      * at boot time. The type of the group can be normally found in the application's
1162      * configuration file.</p>
1163      * For example, with the following entry available in {@code Config.groovy}
1164      * <p/>
1165      * <pre>
1166      * mvcGroups {
1167      *     foo {
1168      *         model      = 'com.acme.FooModel'
1169      *         view       = 'com.acme.FooView'
1170      *         controller = 'com.acme.FooController'
1171      *    }
1172      * }
1173      * </pre>
1174      * <p/>
1175      * An instance of the "foo" group can be used as follows
1176      * <p/>
1177      * <pre>
1178      * withMVC("foo", new MVCFunction&lt;FooModel, FooView, FooController&gt;() {
1179      *     public void call(FooModel m, FooView v, FooController c) {
1180      *         m.setSomeProperty(someValue);
1181      *         c.invokeAnAction();
1182      *     }
1183      * });
1184      * </pre>
1185      *
1186      * @param mvcType the type of group to build.
1187      * @param handler a code block used to configure and manage the instantiated group
1188      *
1189      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1190      *                                                           configuration
1191      */
1192     <M extends GriffonModel, V extends GriffonView, C extends GriffonController> void withMVC(@Nonnull String mvcType, @Nonnull MVCFunction<M, V, C> handler);
1193 
1194     /**
1195      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1196      * <p>This method is of particular interest when working with short lived MVC groups such as
1197      * those used to build dialogs.<p/>
1198      * <p>MVC groups must be previously configured with the application's metadata
1199      * before they can be used. This registration process usually takes place automatically
1200      * at boot time. The type of the group can be normally found in the application's
1201      * configuration file.</p>
1202      * For example, with the following entry available in {@code Config.groovy}
1203      * <p/>
1204      * <pre>
1205      * mvcGroups {
1206      *     foo {
1207      *         model      = 'com.acme.FooModel'
1208      *         view       = 'com.acme.FooView'
1209      *         controller = 'com.acme.FooController'
1210      *     }
1211      * }
1212      * </pre>
1213      * <p/>
1214      * An instance of the "foo" group can be used as follows
1215      * <p/>
1216      * <pre>
1217      * withMVC("foo", "foo1", new MVCFunction&lt;FooModel, FooView, FooController&gt;() {
1218      *     public void call(FooModel m, FooView v, FooController c) {
1219      *         m.setSomeProperty(someValue);
1220      *         c.invokeAnAction();
1221      *     }
1222      * });
1223      * </pre>
1224      * <p/>
1225      * MVC groups must have an unique name.
1226      *
1227      * @param mvcType the type of group to build.
1228      * @param mvcId   the name to assign to the built group.
1229      * @param handler a code block used to configure and manage the instantiated group
1230      *
1231      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1232      *                                                           configuration
1233      */
1234     <M extends GriffonModel, V extends GriffonView, C extends GriffonController> void withMVC(@Nonnull String mvcType, @Nonnull String mvcId, @Nonnull MVCFunction<M, V, C> handler);
1235 
1236     /**
1237      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1238      * <p>This method is of particular interest when working with short lived MVC groups such as
1239      * those used to build dialogs.<p/>
1240      * <p>MVC groups must be previously configured with the application's metadata
1241      * before they can be used. This registration process usually takes place automatically
1242      * at boot time. The type of the group can be normally found in the application's
1243      * configuration file.</p>
1244      * The <tt>args</tt> Map can contain any value that will be used in one of the following
1245      * scenarios <ul>
1246      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
1247      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
1248      * on any MVC member of the group.</li>
1249      * For example, with the following entry available in {@code Config.groovy}
1250      * <p/>
1251      * <pre>
1252      * mvcGroups {
1253      *     foo {
1254      *         model      = 'com.acme.FooModel'
1255      *         view       = 'com.acme.FooView'
1256      *         controller = 'com.acme.FooController'
1257      *     }
1258      * }
1259      * </pre>
1260      * <p/>
1261      * An instance of the "foo" group can be used as follows
1262      * <p/>
1263      * <pre>
1264      * Map<String, Object> map = ... // initialized elsewhere
1265      * withMVC("foo", "foo1", map, new MVCFunction&lt;FooModel, FooView, FooController&gt;() {
1266      *    public void call(FooModel m, FooView v, FooController c) {
1267      *        m.setSomeProperty(someValue);
1268      *        c.invokeAnAction();
1269      *    }
1270      * });
1271      * </pre>
1272      * <p/>
1273      * MVC groups must have an unique name.
1274      *
1275      * @param mvcType the type of group to build.
1276      * @param mvcId   the name to assign to the built group.
1277      * @param args    any useful values that can be set as properties on each MVC member or that
1278      *                identify a member that can be shared with other groups.
1279      * @param handler a code block used to configure and manage the instantiated group
1280      *
1281      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1282      *                                                           configuration
1283      */
1284     <M extends GriffonModel, V extends GriffonView, C extends GriffonController> void withMVC(@Nonnull String mvcType, @Nonnull String mvcId, @Nonnull Map<String, Object> args, @Nonnull MVCFunction<M, V, C> handler);
1285 
1286     /**
1287      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1288      * <p>This method is of particular interest when working with short lived MVC groups such as
1289      * those used to build dialogs.<p/>
1290      * <p>MVC groups must be previously configured with the application's metadata
1291      * before they can be used. This registration process usually takes place automatically
1292      * at boot time. The type of the group can be normally found in the application's
1293      * configuration file.</p>
1294      * The <tt>args</tt> Map can contain any value that will be used in one of the following
1295      * scenarios <ul>
1296      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
1297      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
1298      * on any MVC member of the group.</li>
1299      * For example, with the following entry available in {@code Config.groovy}
1300      * <p/>
1301      * <pre>
1302      * mvcGroups {
1303      *     foo {
1304      *         model      = 'com.acme.FooModel'
1305      *         view       = 'com.acme.FooView'
1306      *         controller = 'com.acme.FooController'
1307      *     }
1308      * }
1309      * </pre>
1310      * <p/>
1311      * An instance of the "foo" group can be used as follows
1312      * <p/>
1313      * <pre>
1314      * Map<String, Object> map = ... // initialized elsewhere
1315      * withMVC("foo", "foo1", map, new MVCFunction&lt;FooModel, FooView, FooController&gt;() {
1316      *    public void call(FooModel m, FooView v, FooController c) {
1317      *        m.setSomeProperty(someValue);
1318      *        c.invokeAnAction();
1319      *    }
1320      * });
1321      * </pre>
1322      * <p/>
1323      * MVC groups must have an unique name.
1324      *
1325      * @param args    any useful values that can be set as properties on each MVC member or that
1326      *                identify a member that can be shared with other groups.
1327      * @param mvcType the type of group to build.
1328      * @param mvcId   the name to assign to the built group.
1329      * @param handler a code block used to configure and manage the instantiated group
1330      *
1331      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1332      *                                                           configuration
1333      */
1334     <M extends GriffonModel, V extends GriffonView, C extends GriffonController> void withMVC(@Nonnull Map<String, Object> args, @Nonnull String mvcType, @Nonnull String mvcId, @Nonnull MVCFunction<M, V, C> handler);
1335 
1336     /**
1337      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1338      * <p>This method is of particular interest when working with short lived MVC groups such as
1339      * those used to build dialogs.<p/>
1340      * <p>MVC groups must be previously configured with the application's metadata
1341      * before they can be used. This registration process usually takes place automatically
1342      * at boot time. The type of the group can be normally found in the application's
1343      * configuration file.</p>
1344      * The <tt>args</tt> Map can contain any value that will be used in one of the following
1345      * scenarios <ul>
1346      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
1347      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
1348      * on any MVC member of the group.</li>
1349      * For example, with the following entry available in {@code Config.groovy}
1350      * <p/>
1351      * <pre>
1352      * mvcGroups {
1353      *     foo {
1354      *         model      = 'com.acme.FooModel'
1355      *         view       = 'com.acme.FooView'
1356      *         controller = 'com.acme.FooController'
1357      *    }
1358      * }
1359      * </pre>
1360      * <p/>
1361      * An instance of the "foo" group can be used as follows
1362      * <p/>
1363      * <pre>
1364      * Map<String, Object> map = ... // initialized elsewhere
1365      * withMVC("foo", map, new MVCFunction&lt;FooModel, FooView, FooController&gt;() {
1366      *    public void call(FooModel m, FooView v, FooController c) {
1367      *        m.setSomeProperty(someValue);
1368      *        c.invokeAnAction();
1369      *    }
1370      * });
1371      * </pre>
1372      *
1373      * @param mvcType the type of group to build.
1374      * @param args    any useful values that can be set as properties on each MVC member or that
1375      *                identify a member that can be shared with other groups.
1376      * @param handler a code block used to configure and manage the instantiated group
1377      *
1378      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1379      *                                                           configuration
1380      */
1381     <M extends GriffonModel, V extends GriffonView, C extends GriffonController> void withMVC(@Nonnull String mvcType, @Nonnull Map<String, Object> args, @Nonnull MVCFunction<M, V, C> handler);
1382 
1383     /**
1384      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1385      * <p>This method is of particular interest when working with short lived MVC groups such as
1386      * those used to build dialogs.<p/>
1387      * <p>MVC groups must be previously configured with the application's metadata
1388      * before they can be used. This registration process usually takes place automatically
1389      * at boot time. The type of the group can be normally found in the application's
1390      * configuration file.</p>
1391      * The <tt>args</tt> Map can contain any value that will be used in one of the following
1392      * scenarios <ul>
1393      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
1394      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
1395      * on any MVC member of the group.</li>
1396      * For example, with the following entry available in {@code Config.groovy}
1397      * <p/>
1398      * <pre>
1399      * mvcGroups {
1400      *     foo {
1401      *         model      = 'com.acme.FooModel'
1402      *         view       = 'com.acme.FooView'
1403      *         controller = 'com.acme.FooController'
1404      *    }
1405      * }
1406      * </pre>
1407      * <p/>
1408      * An instance of the "foo" group can be used as follows
1409      * <p/>
1410      * <pre>
1411      * Map<String, Object> map = ... // initialized elsewhere
1412      * withMVC("foo", map, new MVCFunction&lt;FooModel, FooView, FooController&gt;() {
1413      *    public void call(FooModel m, FooView v, FooController c) {
1414      *        m.setSomeProperty(someValue);
1415      *        c.invokeAnAction();
1416      *    }
1417      * });
1418      * </pre>
1419      *
1420      * @param args    any useful values that can be set as properties on each MVC member or that
1421      *                identify a member that can be shared with other groups.
1422      * @param mvcType the type of group to build.
1423      * @param handler a code block used to configure and manage the instantiated group
1424      *
1425      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1426      *                                                           configuration
1427      */
1428     <M extends GriffonModel, V extends GriffonView, C extends GriffonController> void withMVC(@Nonnull Map<String, Object> args, @Nonnull String mvcType, @Nonnull MVCFunction<M, V, C> handler);
1429 
1430     /**
1431      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1432      * <p>This method is of particular interest when working with short lived MVC groups such as
1433      * those used to build dialogs.<p/>
1434      * <p>MVC groups must be previously configured with the application's metadata
1435      * before they can be used. This registration process usually takes place automatically
1436      * at boot time. The type of the group can be normally found in the application's
1437      * configuration file.</p>
1438      * For example, with the following entry available in {@code Config.groovy}
1439      * <p/>
1440      * <pre>
1441      * mvcGroups {
1442      *     foo {
1443      *         model      = 'com.acme.FooModel'
1444      *         view       = 'com.acme.FooView'
1445      *         controller = 'com.acme.FooController'
1446      *    }
1447      * }
1448      * </pre>
1449      * <p/>
1450      * An instance of the "foo" group can be used as follows
1451      * <p/>
1452      * <pre>
1453      * withMVC(FooMVCGroup.class, new MVCFunction&lt;FooModel, FooView, FooController&gt;() {
1454      *     public void call(FooModel m, FooView v, FooController c) {
1455      *         m.setSomeProperty(someValue);
1456      *         c.invokeAnAction();
1457      *     }
1458      * });
1459      * </pre>
1460      *
1461      * @param mvcType the type of group to build.
1462      * @param handler a code block used to configure and manage the instantiated group
1463      *
1464      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1465      *                                                           configuration
1466      * @since 2.11.0
1467      */
1468     <MVC extends TypedMVCGroup, M extends GriffonModel, V extends GriffonView, C extends GriffonController> void withMVC(@Nonnull Class<? extends MVC> mvcType, @Nonnull MVCFunction<M, V, C> handler);
1469 
1470     /**
1471      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1472      * <p>This method is of particular interest when working with short lived MVC groups such as
1473      * those used to build dialogs.<p/>
1474      * <p>MVC groups must be previously configured with the application's metadata
1475      * before they can be used. This registration process usually takes place automatically
1476      * at boot time. The type of the group can be normally found in the application's
1477      * configuration file.</p>
1478      * For example, with the following entry available in {@code Config.groovy}
1479      * <p/>
1480      * <pre>
1481      * mvcGroups {
1482      *     foo {
1483      *         model      = 'com.acme.FooModel'
1484      *         view       = 'com.acme.FooView'
1485      *         controller = 'com.acme.FooController'
1486      *     }
1487      * }
1488      * </pre>
1489      * <p/>
1490      * An instance of the "foo" group can be used as follows
1491      * <p/>
1492      * <pre>
1493      * withMVC(FooMVCGroup.class, "foo1", new MVCFunction&lt;FooModel, FooView, FooController&gt;() {
1494      *     public void call(FooModel m, FooView v, FooController c) {
1495      *         m.setSomeProperty(someValue);
1496      *         c.invokeAnAction();
1497      *     }
1498      * });
1499      * </pre>
1500      * <p/>
1501      * MVC groups must have an unique name.
1502      *
1503      * @param mvcType the type of group to build.
1504      * @param mvcId   the name to assign to the built group.
1505      * @param handler a code block used to configure and manage the instantiated group
1506      *
1507      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1508      *                                                           configuration
1509      * @since 2.11.0
1510      */
1511     <MVC extends TypedMVCGroup, M extends GriffonModel, V extends GriffonView, C extends GriffonController> void withMVC(@Nonnull Class<? extends MVC> mvcType, @Nonnull String mvcId, @Nonnull MVCFunction<M, V, C> handler);
1512 
1513     /**
1514      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1515      * <p>This method is of particular interest when working with short lived MVC groups such as
1516      * those used to build dialogs.<p/>
1517      * <p>MVC groups must be previously configured with the application's metadata
1518      * before they can be used. This registration process usually takes place automatically
1519      * at boot time. The type of the group can be normally found in the application's
1520      * configuration file.</p>
1521      * The <tt>args</tt> Map can contain any value that will be used in one of the following
1522      * scenarios <ul>
1523      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
1524      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
1525      * on any MVC member of the group.</li>
1526      * For example, with the following entry available in {@code Config.groovy}
1527      * <p/>
1528      * <pre>
1529      * mvcGroups {
1530      *     foo {
1531      *         model      = 'com.acme.FooModel'
1532      *         view       = 'com.acme.FooView'
1533      *         controller = 'com.acme.FooController'
1534      *     }
1535      * }
1536      * </pre>
1537      * <p/>
1538      * An instance of the "foo" group can be used as follows
1539      * <p/>
1540      * <pre>
1541      * Map<String, Object> map = ... // initialized elsewhere
1542      * withMVC(FooMVCGroup.class, "foo1", map, new MVCFunction&lt;FooModel, FooView, FooController&gt;() {
1543      *    public void call(FooModel m, FooView v, FooController c) {
1544      *        m.setSomeProperty(someValue);
1545      *        c.invokeAnAction();
1546      *    }
1547      * });
1548      * </pre>
1549      * <p/>
1550      * MVC groups must have an unique name.
1551      *
1552      * @param mvcType the type of group to build.
1553      * @param mvcId   the name to assign to the built group.
1554      * @param args    any useful values that can be set as properties on each MVC member or that
1555      *                identify a member that can be shared with other groups.
1556      * @param handler a code block used to configure and manage the instantiated group
1557      *
1558      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1559      *                                                           configuration
1560      * @since 2.11.0
1561      */
1562     <MVC extends TypedMVCGroup, M extends GriffonModel, V extends GriffonView, C extends GriffonController> void withMVC(@Nonnull Class<? extends MVC> mvcType, @Nonnull String mvcId, @Nonnull Map<String, Object> args, @Nonnull MVCFunction<M, V, C> handler);
1563 
1564     /**
1565      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1566      * <p>This method is of particular interest when working with short lived MVC groups such as
1567      * those used to build dialogs.<p/>
1568      * <p>MVC groups must be previously configured with the application's metadata
1569      * before they can be used. This registration process usually takes place automatically
1570      * at boot time. The type of the group can be normally found in the application's
1571      * configuration file.</p>
1572      * The <tt>args</tt> Map can contain any value that will be used in one of the following
1573      * scenarios <ul>
1574      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
1575      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
1576      * on any MVC member of the group.</li>
1577      * For example, with the following entry available in {@code Config.groovy}
1578      * <p/>
1579      * <pre>
1580      * mvcGroups {
1581      *     foo {
1582      *         model      = 'com.acme.FooModel'
1583      *         view       = 'com.acme.FooView'
1584      *         controller = 'com.acme.FooController'
1585      *     }
1586      * }
1587      * </pre>
1588      * <p/>
1589      * An instance of the "foo" group can be used as follows
1590      * <p/>
1591      * <pre>
1592      * Map<String, Object> map = ... // initialized elsewhere
1593      * withMVC(FooMVCGroup.class, "foo1", map, new MVCFunction&lt;FooModel, FooView, FooController&gt;() {
1594      *    public void call(FooModel m, FooView v, FooController c) {
1595      *        m.setSomeProperty(someValue);
1596      *        c.invokeAnAction();
1597      *    }
1598      * });
1599      * </pre>
1600      * <p/>
1601      * MVC groups must have an unique name.
1602      *
1603      * @param args    any useful values that can be set as properties on each MVC member or that
1604      *                identify a member that can be shared with other groups.
1605      * @param mvcType the type of group to build.
1606      * @param mvcId   the name to assign to the built group.
1607      * @param handler a code block used to configure and manage the instantiated group
1608      *
1609      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1610      *                                                           configuration
1611      * @since 2.11.0
1612      */
1613     <MVC extends TypedMVCGroup, M extends GriffonModel, V extends GriffonView, C extends GriffonController> void withMVC(@Nonnull Map<String, Object> args, @Nonnull Class<? extends MVC> mvcType, @Nonnull String mvcId, @Nonnull MVCFunction<M, V, C> handler);
1614 
1615     /**
1616      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1617      * <p>This method is of particular interest when working with short lived MVC groups such as
1618      * those used to build dialogs.<p/>
1619      * <p>MVC groups must be previously configured with the application's metadata
1620      * before they can be used. This registration process usually takes place automatically
1621      * at boot time. The type of the group can be normally found in the application's
1622      * configuration file.</p>
1623      * The <tt>args</tt> Map can contain any value that will be used in one of the following
1624      * scenarios <ul>
1625      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
1626      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
1627      * on any MVC member of the group.</li>
1628      * For example, with the following entry available in {@code Config.groovy}
1629      * <p/>
1630      * <pre>
1631      * mvcGroups {
1632      *     foo {
1633      *         model      = 'com.acme.FooModel'
1634      *         view       = 'com.acme.FooView'
1635      *         controller = 'com.acme.FooController'
1636      *    }
1637      * }
1638      * </pre>
1639      * <p/>
1640      * An instance of the "foo" group can be used as follows
1641      * <p/>
1642      * <pre>
1643      * Map<String, Object> map = ... // initialized elsewhere
1644      * withMVC(FooMVCGroup.class, map, new MVCFunction&lt;FooModel, FooView, FooController&gt;() {
1645      *    public void call(FooModel m, FooView v, FooController c) {
1646      *        m.setSomeProperty(someValue);
1647      *        c.invokeAnAction();
1648      *    }
1649      * });
1650      * </pre>
1651      *
1652      * @param mvcType the type of group to build.
1653      * @param args    any useful values that can be set as properties on each MVC member or that
1654      *                identify a member that can be shared with other groups.
1655      * @param handler a code block used to configure and manage the instantiated group
1656      *
1657      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1658      *                                                           configuration
1659      * @since 2.11.0
1660      */
1661     <MVC extends TypedMVCGroup, M extends GriffonModel, V extends GriffonView, C extends GriffonController> void withMVC(@Nonnull Class<? extends MVC> mvcType, @Nonnull Map<String, Object> args, @Nonnull MVCFunction<M, V, C> handler);
1662 
1663     /**
1664      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1665      * <p>This method is of particular interest when working with short lived MVC groups such as
1666      * those used to build dialogs.<p/>
1667      * <p>MVC groups must be previously configured with the application's metadata
1668      * before they can be used. This registration process usually takes place automatically
1669      * at boot time. The type of the group can be normally found in the application's
1670      * configuration file.</p>
1671      * The <tt>args</tt> Map can contain any value that will be used in one of the following
1672      * scenarios <ul>
1673      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
1674      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
1675      * on any MVC member of the group.</li>
1676      * For example, with the following entry available in {@code Config.groovy}
1677      * <p/>
1678      * <pre>
1679      * mvcGroups {
1680      *     foo {
1681      *         model      = 'com.acme.FooModel'
1682      *         view       = 'com.acme.FooView'
1683      *         controller = 'com.acme.FooController'
1684      *    }
1685      * }
1686      * </pre>
1687      * <p/>
1688      * An instance of the "foo" group can be used as follows
1689      * <p/>
1690      * <pre>
1691      * Map<String, Object> map = ... // initialized elsewhere
1692      * withMVC(FooMVCGroup.class, map, new MVCFunction&lt;FooModel, FooView, FooController&gt;() {
1693      *    public void call(FooModel m, FooView v, FooController c) {
1694      *        m.setSomeProperty(someValue);
1695      *        c.invokeAnAction();
1696      *    }
1697      * });
1698      * </pre>
1699      *
1700      * @param args    any useful values that can be set as properties on each MVC member or that
1701      *                identify a member that can be shared with other groups.
1702      * @param mvcType the type of group to build.
1703      * @param handler a code block used to configure and manage the instantiated group
1704      *
1705      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1706      *                                                           configuration
1707      * @since 2.11.0
1708      */
1709     <MVC extends TypedMVCGroup, M extends GriffonModel, V extends GriffonView, C extends GriffonController> void withMVC(@Nonnull Map<String, Object> args, @Nonnull Class<? extends MVC> mvcType, @Nonnull MVCFunction<M, V, C> handler);
1710 
1711     /**
1712      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1713      * <p>This method is of particular interest when working with short lived MVC groups such as
1714      * those used to build dialogs.<p/>
1715      * <p>MVC groups must be previously configured with the application's metadata
1716      * before they can be used. This registration process usually takes place automatically
1717      * at boot time. The type of the group can be normally found in the application's
1718      * configuration file.</p>
1719      * For example, with the following entry available in {@code Config.groovy}
1720      * <p/>
1721      * <pre>
1722      * mvcGroups {
1723      *     foo {
1724      *         model      = 'com.acme.FooModel'
1725      *         view       = 'com.acme.FooView'
1726      *         controller = 'com.acme.FooController'
1727      *    }
1728      * }
1729      * </pre>
1730      * <p/>
1731      * An instance of the "foo" group can be used as follows
1732      * <p/>
1733      * <pre>
1734      * withMVCGroup("foo", new MVCGroupFunction() {
1735      *     public void call(MVCGroup group) {
1736      *         group.getModel().setSomeProperty(someValue);
1737      *         group.getController().invokeAnAction();
1738      *     }
1739      * });
1740      * </pre>
1741      *
1742      * @param mvcType the type of group to build.
1743      * @param handler a code block used to configure and manage the instantiated group
1744      *
1745      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1746      *                                                           configuration
1747      * @since 2.1.0
1748      */
1749     void withMVCGroup(@Nonnull String mvcType, @Nonnull MVCGroupFunction handler);
1750 
1751     /**
1752      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1753      * <p>This method is of particular interest when working with short lived MVC groups such as
1754      * those used to build dialogs.<p/>
1755      * <p>MVC groups must be previously configured with the application's metadata
1756      * before they can be used. This registration process usually takes place automatically
1757      * at boot time. The type of the group can be normally found in the application's
1758      * configuration file.</p>
1759      * For example, with the following entry available in {@code Config.groovy}
1760      * <p/>
1761      * <pre>
1762      * mvcGroups {
1763      *     foo {
1764      *         model      = 'com.acme.FooModel'
1765      *         view       = 'com.acme.FooView'
1766      *         controller = 'com.acme.FooController'
1767      *     }
1768      * }
1769      * </pre>
1770      * <p/>
1771      * An instance of the "foo" group can be used as follows
1772      * <p/>
1773      * <pre>
1774      * withMVCGroup("foo", "foo1", new MVCGroupFunction() {
1775      *     public void call(MVCGroup group) {
1776      *         group.getModel().setSomeProperty(someValue);
1777      *         group.getController().invokeAnAction();
1778      *     }
1779      * });
1780      * </pre>
1781      * <p/>
1782      * MVC groups must have an unique name.
1783      *
1784      * @param mvcType the type of group to build.
1785      * @param mvcId   the name to assign to the built group.
1786      * @param handler a code block used to configure and manage the instantiated group
1787      *
1788      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1789      *                                                           configuration
1790      * @since 2.1.0
1791      */
1792     void withMVCGroup(@Nonnull String mvcType, @Nonnull String mvcId, @Nonnull MVCGroupFunction handler);
1793 
1794     /**
1795      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1796      * <p>This method is of particular interest when working with short lived MVC groups such as
1797      * those used to build dialogs.<p/>
1798      * <p>MVC groups must be previously configured with the application's metadata
1799      * before they can be used. This registration process usually takes place automatically
1800      * at boot time. The type of the group can be normally found in the application's
1801      * configuration file.</p>
1802      * The <tt>args</tt> Map can contain any value that will be used in one of the following
1803      * scenarios <ul>
1804      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
1805      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
1806      * on any MVC member of the group.</li>
1807      * For example, with the following entry available in {@code Config.groovy}
1808      * <p/>
1809      * <pre>
1810      * mvcGroups {
1811      *     foo {
1812      *         model      = 'com.acme.FooModel'
1813      *         view       = 'com.acme.FooView'
1814      *         controller = 'com.acme.FooController'
1815      *     }
1816      * }
1817      * </pre>
1818      * <p/>
1819      * An instance of the "foo" group can be used as follows
1820      * <p/>
1821      * <pre>
1822      * Map<String, Object> map = ... // initialized elsewhere
1823      * withMVCGroup("foo", "foo1", map, new MVCGroupFunction() {
1824      *    public void call(MVCGroup group) {
1825      *        group.getModel().setSomeProperty(someValue);
1826      *        group.getController().invokeAnAction();
1827      *    }
1828      * });
1829      * </pre>
1830      * <p/>
1831      * MVC groups must have an unique name.
1832      *
1833      * @param mvcType the type of group to build.
1834      * @param mvcId   the name to assign to the built group.
1835      * @param args    any useful values that can be set as properties on each MVC member or that
1836      *                identify a member that can be shared with other groups.
1837      * @param handler a code block used to configure and manage the instantiated group
1838      *
1839      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1840      *                                                           configuration
1841      * @since 2.1.0
1842      */
1843     void withMVCGroup(@Nonnull String mvcType, @Nonnull String mvcId, @Nonnull Map<String, Object> args, @Nonnull MVCGroupFunction handler);
1844 
1845     /**
1846      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1847      * <p>This method is of particular interest when working with short lived MVC groups such as
1848      * those used to build dialogs.<p/>
1849      * <p>MVC groups must be previously configured with the application's metadata
1850      * before they can be used. This registration process usually takes place automatically
1851      * at boot time. The type of the group can be normally found in the application's
1852      * configuration file.</p>
1853      * The <tt>args</tt> Map can contain any value that will be used in one of the following
1854      * scenarios <ul>
1855      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
1856      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
1857      * on any MVC member of the group.</li>
1858      * For example, with the following entry available in {@code Config.groovy}
1859      * <p/>
1860      * <pre>
1861      * mvcGroups {
1862      *     foo {
1863      *         model      = 'com.acme.FooModel'
1864      *         view       = 'com.acme.FooView'
1865      *         controller = 'com.acme.FooController'
1866      *     }
1867      * }
1868      * </pre>
1869      * <p/>
1870      * An instance of the "foo" group can be used as follows
1871      * <p/>
1872      * <pre>
1873      * Map<String, Object> map = ... // initialized elsewhere
1874      * withMVCGroup("foo", "foo1", map, new MVCGroupFunction() {
1875      *    public void call(MVCGroup group) {
1876      *        group.getModel().setSomeProperty(someValue);
1877      *        group.getController().invokeAnAction();
1878      *    }
1879      * });
1880      * </pre>
1881      * <p/>
1882      * MVC groups must have an unique name.
1883      *
1884      * @param args    any useful values that can be set as properties on each MVC member or that
1885      *                identify a member that can be shared with other groups.
1886      * @param mvcType the type of group to build.
1887      * @param mvcId   the name to assign to the built group.
1888      * @param handler a code block used to configure and manage the instantiated group
1889      *
1890      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1891      *                                                           configuration
1892      * @since 2.1.0
1893      */
1894     void withMVCGroup(@Nonnull Map<String, Object> args, @Nonnull String mvcType, @Nonnull String mvcId, @Nonnull MVCGroupFunction handler);
1895 
1896     /**
1897      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1898      * <p>This method is of particular interest when working with short lived MVC groups such as
1899      * those used to build dialogs.<p/>
1900      * <p>MVC groups must be previously configured with the application's metadata
1901      * before they can be used. This registration process usually takes place automatically
1902      * at boot time. The type of the group can be normally found in the application's
1903      * configuration file.</p>
1904      * The <tt>args</tt> Map can contain any value that will be used in one of the following
1905      * scenarios <ul>
1906      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
1907      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
1908      * on any MVC member of the group.</li>
1909      * For example, with the following entry available in {@code Config.groovy}
1910      * <p/>
1911      * <pre>
1912      * mvcGroups {
1913      *     foo {
1914      *         model      = 'com.acme.FooModel'
1915      *         view       = 'com.acme.FooView'
1916      *         controller = 'com.acme.FooController'
1917      *    }
1918      * }
1919      * </pre>
1920      * <p/>
1921      * An instance of the "foo" group can be used as follows
1922      * <p/>
1923      * <pre>
1924      * Map<String, Object> map = ... // initialized elsewhere
1925      * withMVCGroup("foo", map, new MVCGroupFunction() {
1926      *    public void call(MVCGroup group) {
1927      *        group.getModel().setSomeProperty(someValue);
1928      *        group.getController().invokeAnAction();
1929      *    }
1930      * });
1931      * </pre>
1932      *
1933      * @param mvcType the type of group to build.
1934      * @param args    any useful values that can be set as properties on each MVC member or that
1935      *                identify a member that can be shared with other groups.
1936      * @param handler a code block used to configure and manage the instantiated group
1937      *
1938      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1939      *                                                           configuration
1940      * @since 2.1.0
1941      */
1942     void withMVCGroup(@Nonnull String mvcType, @Nonnull Map<String, Object> args, @Nonnull MVCGroupFunction handler);
1943 
1944     /**
1945      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1946      * <p>This method is of particular interest when working with short lived MVC groups such as
1947      * those used to build dialogs.<p/>
1948      * <p>MVC groups must be previously configured with the application's metadata
1949      * before they can be used. This registration process usually takes place automatically
1950      * at boot time. The type of the group can be normally found in the application's
1951      * configuration file.</p>
1952      * The <tt>args</tt> Map can contain any value that will be used in one of the following
1953      * scenarios <ul>
1954      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
1955      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
1956      * on any MVC member of the group.</li>
1957      * For example, with the following entry available in {@code Config.groovy}
1958      * <p/>
1959      * <pre>
1960      * mvcGroups {
1961      *     foo {
1962      *         model      = 'com.acme.FooModel'
1963      *         view       = 'com.acme.FooView'
1964      *         controller = 'com.acme.FooController'
1965      *    }
1966      * }
1967      * </pre>
1968      * <p/>
1969      * An instance of the "foo" group can be used as follows
1970      * <p/>
1971      * <pre>
1972      * Map<String, Object> map = ... // initialized elsewhere
1973      * withMVCGroup("foo", map, new MVCGroupFunction() {
1974      *    public void call(MVCGroup group) {
1975      *        group.getModel().setSomeProperty(someValue);
1976      *        group.getController().invokeAnAction();
1977      *    }
1978      * });
1979      * </pre>
1980      *
1981      * @param args    any useful values that can be set as properties on each MVC member or that
1982      *                identify a member that can be shared with other groups.
1983      * @param mvcType the type of group to build.
1984      * @param handler a code block used to configure and manage the instantiated group
1985      *
1986      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
1987      *                                                           configuration
1988      * @since 2.1.0
1989      */
1990     void withMVCGroup(@Nonnull Map<String, Object> args, @Nonnull String mvcType, @Nonnull MVCGroupFunction handler);
1991 
1992     /**
1993      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
1994      * <p>This method is of particular interest when working with short lived MVC groups such as
1995      * those used to build dialogs.<p/>
1996      * <p>MVC groups must be previously configured with the application's metadata
1997      * before they can be used. This registration process usually takes place automatically
1998      * at boot time. The type of the group can be normally found in the application's
1999      * configuration file.</p>
2000      * For example, with the following entry available in {@code Config.groovy}
2001      * <p/>
2002      * <pre>
2003      * mvcGroups {
2004      *     foo {
2005      *         model      = 'com.acme.FooModel'
2006      *         view       = 'com.acme.FooView'
2007      *         controller = 'com.acme.FooController'
2008      *    }
2009      * }
2010      * </pre>
2011      * <p/>
2012      * An instance of the "foo" group can be used as follows
2013      * <p/>
2014      * <pre>
2015      * withMVCGroup(FooMVCGroup.class, new TypedMVCGroupFunction<>() {
2016      *     public void call(MVC group) {
2017      *         group.getModel().setSomeProperty(someValue);
2018      *         group.getController().invokeAnAction();
2019      *     }
2020      * });
2021      * </pre>
2022      *
2023      * @param mvcType the type of group to build.
2024      * @param handler a code block used to configure and manage the instantiated group
2025      *
2026      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
2027      *                                                           configuration
2028      * @since 2.11.0
2029      */
2030     <MVC extends TypedMVCGroup> void withMVCGroup(@Nonnull Class<? extends MVC> mvcType, @Nonnull TypedMVCGroupFunction<MVC> handler);
2031 
2032     /**
2033      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
2034      * <p>This method is of particular interest when working with short lived MVC groups such as
2035      * those used to build dialogs.<p/>
2036      * <p>MVC groups must be previously configured with the application's metadata
2037      * before they can be used. This registration process usually takes place automatically
2038      * at boot time. The type of the group can be normally found in the application's
2039      * configuration file.</p>
2040      * For example, with the following entry available in {@code Config.groovy}
2041      * <p/>
2042      * <pre>
2043      * mvcGroups {
2044      *     foo {
2045      *         model      = 'com.acme.FooModel'
2046      *         view       = 'com.acme.FooView'
2047      *         controller = 'com.acme.FooController'
2048      *     }
2049      * }
2050      * </pre>
2051      * <p/>
2052      * An instance of the "foo" group can be used as follows
2053      * <p/>
2054      * <pre>
2055      * withMVCGroup(FooMVCGroup.class, "foo1", new TypedMVCGroupFunction<>() {
2056      *     public void call(MVC group) {
2057      *         group.getModel().setSomeProperty(someValue);
2058      *         group.getController().invokeAnAction();
2059      *     }
2060      * });
2061      * </pre>
2062      * <p/>
2063      * MVC groups must have an unique name.
2064      *
2065      * @param mvcType the type of group to build.
2066      * @param mvcId   the name to assign to the built group.
2067      * @param handler a code block used to configure and manage the instantiated group
2068      *
2069      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
2070      *                                                           configuration
2071      * @since 2.11.0
2072      */
2073     <MVC extends TypedMVCGroup> void withMVCGroup(@Nonnull Class<? extends MVC> mvcType, @Nonnull String mvcId, @Nonnull TypedMVCGroupFunction<MVC> handler);
2074 
2075     /**
2076      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
2077      * <p>This method is of particular interest when working with short lived MVC groups such as
2078      * those used to build dialogs.<p/>
2079      * <p>MVC groups must be previously configured with the application's metadata
2080      * before they can be used. This registration process usually takes place automatically
2081      * at boot time. The type of the group can be normally found in the application's
2082      * configuration file.</p>
2083      * The <tt>args</tt> Map can contain any value that will be used in one of the following
2084      * scenarios <ul>
2085      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
2086      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
2087      * on any MVC member of the group.</li>
2088      * For example, with the following entry available in {@code Config.groovy}
2089      * <p/>
2090      * <pre>
2091      * mvcGroups {
2092      *     foo {
2093      *         model      = 'com.acme.FooModel'
2094      *         view       = 'com.acme.FooView'
2095      *         controller = 'com.acme.FooController'
2096      *     }
2097      * }
2098      * </pre>
2099      * <p/>
2100      * An instance of the "foo" group can be used as follows
2101      * <p/>
2102      * <pre>
2103      * Map<String, Object> map = ... // initialized elsewhere
2104      * withMVCGroup(FooMVCGroup.class, "foo1", map, new TypedMVCGroupFunction<>() {
2105      *    public void call(MVC group) {
2106      *        group.getModel().setSomeProperty(someValue);
2107      *        group.getController().invokeAnAction();
2108      *    }
2109      * });
2110      * </pre>
2111      * <p/>
2112      * MVC groups must have an unique name.
2113      *
2114      * @param mvcType the type of group to build.
2115      * @param mvcId   the name to assign to the built group.
2116      * @param args    any useful values that can be set as properties on each MVC member or that
2117      *                identify a member that can be shared with other groups.
2118      * @param handler a code block used to configure and manage the instantiated group
2119      *
2120      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
2121      *                                                           configuration
2122      * @since 2.11.0
2123      */
2124     <MVC extends TypedMVCGroup> void withMVCGroup(@Nonnull Class<? extends MVC> mvcType, @Nonnull String mvcId, @Nonnull Map<String, Object> args, @Nonnull TypedMVCGroupFunction<MVC> handler);
2125 
2126     /**
2127      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
2128      * <p>This method is of particular interest when working with short lived MVC groups such as
2129      * those used to build dialogs.<p/>
2130      * <p>MVC groups must be previously configured with the application's metadata
2131      * before they can be used. This registration process usually takes place automatically
2132      * at boot time. The type of the group can be normally found in the application's
2133      * configuration file.</p>
2134      * The <tt>args</tt> Map can contain any value that will be used in one of the following
2135      * scenarios <ul>
2136      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
2137      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
2138      * on any MVC member of the group.</li>
2139      * For example, with the following entry available in {@code Config.groovy}
2140      * <p/>
2141      * <pre>
2142      * mvcGroups {
2143      *     foo {
2144      *         model      = 'com.acme.FooModel'
2145      *         view       = 'com.acme.FooView'
2146      *         controller = 'com.acme.FooController'
2147      *     }
2148      * }
2149      * </pre>
2150      * <p/>
2151      * An instance of the "foo" group can be used as follows
2152      * <p/>
2153      * <pre>
2154      * Map<String, Object> map = ... // initialized elsewhere
2155      * withMVCGroup(FooMVCGroup.class, "foo1", map, new TypedMVCGroupFunction<>() {
2156      *    public void call(MVC group) {
2157      *        group.getModel().setSomeProperty(someValue);
2158      *        group.getController().invokeAnAction();
2159      *    }
2160      * });
2161      * </pre>
2162      * <p/>
2163      * MVC groups must have an unique name.
2164      *
2165      * @param args    any useful values that can be set as properties on each MVC member or that
2166      *                identify a member that can be shared with other groups.
2167      * @param mvcType the type of group to build.
2168      * @param mvcId   the name to assign to the built group.
2169      * @param handler a code block used to configure and manage the instantiated group
2170      *
2171      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
2172      *                                                           configuration
2173      * @since 2.11.0
2174      */
2175     <MVC extends TypedMVCGroup> void withMVCGroup(@Nonnull Map<String, Object> args, @Nonnull Class<? extends MVC> mvcType, @Nonnull String mvcId, @Nonnull TypedMVCGroupFunction<MVC> handler);
2176 
2177     /**
2178      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
2179      * <p>This method is of particular interest when working with short lived MVC groups such as
2180      * those used to build dialogs.<p/>
2181      * <p>MVC groups must be previously configured with the application's metadata
2182      * before they can be used. This registration process usually takes place automatically
2183      * at boot time. The type of the group can be normally found in the application's
2184      * configuration file.</p>
2185      * The <tt>args</tt> Map can contain any value that will be used in one of the following
2186      * scenarios <ul>
2187      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
2188      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
2189      * on any MVC member of the group.</li>
2190      * For example, with the following entry available in {@code Config.groovy}
2191      * <p/>
2192      * <pre>
2193      * mvcGroups {
2194      *     foo {
2195      *         model      = 'com.acme.FooModel'
2196      *         view       = 'com.acme.FooView'
2197      *         controller = 'com.acme.FooController'
2198      *    }
2199      * }
2200      * </pre>
2201      * <p/>
2202      * An instance of the "foo" group can be used as follows
2203      * <p/>
2204      * <pre>
2205      * Map<String, Object> map = ... // initialized elsewhere
2206      * withMVCGroup(FooMVCGroup.class, map, new TypedMVCGroupFunction<>() {
2207      *    public void call(MVC group) {
2208      *        group.getModel().setSomeProperty(someValue);
2209      *        group.getController().invokeAnAction();
2210      *    }
2211      * });
2212      * </pre>
2213      *
2214      * @param mvcType the type of group to build.
2215      * @param args    any useful values that can be set as properties on each MVC member or that
2216      *                identify a member that can be shared with other groups.
2217      * @param handler a code block used to configure and manage the instantiated group
2218      *
2219      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
2220      *                                                           configuration
2221      * @since 2.11.0
2222      */
2223     <MVC extends TypedMVCGroup> void withMVCGroup(@Nonnull Class<? extends MVC> mvcType, @Nonnull Map<String, Object> args, @Nonnull TypedMVCGroupFunction<MVC> handler);
2224 
2225     /**
2226      * Instantiates an MVC group of the specified type then destroys it after it has been handled.<p>
2227      * <p>This method is of particular interest when working with short lived MVC groups such as
2228      * those used to build dialogs.<p/>
2229      * <p>MVC groups must be previously configured with the application's metadata
2230      * before they can be used. This registration process usually takes place automatically
2231      * at boot time. The type of the group can be normally found in the application's
2232      * configuration file.</p>
2233      * The <tt>args</tt> Map can contain any value that will be used in one of the following
2234      * scenarios <ul>
2235      * <li>The key matches a member definition; the value will be used as the instance of such member.</li>
2236      * <li>The key does not match a member definition, the value is assumed to be a property that can be set
2237      * on any MVC member of the group.</li>
2238      * For example, with the following entry available in {@code Config.groovy}
2239      * <p/>
2240      * <pre>
2241      * mvcGroups {
2242      *     foo {
2243      *         model      = 'com.acme.FooModel'
2244      *         view       = 'com.acme.FooView'
2245      *         controller = 'com.acme.FooController'
2246      *    }
2247      * }
2248      * </pre>
2249      * <p/>
2250      * An instance of the "foo" group can be used as follows
2251      * <p/>
2252      * <pre>
2253      * Map<String, Object> map = ... // initialized elsewhere
2254      * withMVCGroup(FooMVCGroup.class, map, new TypedMVCGroupFunction<>() {
2255      *    public void call(MVC group) {
2256      *        group.getModel().setSomeProperty(someValue);
2257      *        group.getController().invokeAnAction();
2258      *    }
2259      * });
2260      * </pre>
2261      *
2262      * @param args    any useful values that can be set as properties on each MVC member or that
2263      *                identify a member that can be shared with other groups.
2264      * @param mvcType the type of group to build.
2265      * @param handler a code block used to configure and manage the instantiated group
2266      *
2267      * @throws griffon.exceptions.MVCGroupInstantiationException - if the type specified is not found in the application's
2268      *                                                           configuration
2269      * @since 2.11.0
2270      */
2271     <MVC extends TypedMVCGroup> void withMVCGroup(@Nonnull Map<String, Object> args, @Nonnull Class<? extends MVC> mvcType, @Nonnull TypedMVCGroupFunction<MVC> handler);
2272 }