/// <summary>
        ///   Creates a new <see cref="BehaviorChainConfiguration"/> from this
        ///   template.
        /// </summary>
        // TODO: Comment.
        internal BehaviorChainConfiguration CreateConfiguration(
            IBehaviorFactoryConfiguration factoryConfiguration
            )
        {
            Check.NotNull(factoryConfiguration, nameof(factoryConfiguration));

            var config = new BehaviorChainConfiguration();
            IBehaviorFactory factory = factoryConfiguration.GetFactory(_factoryProvider);

            foreach (BehaviorChainItemTemplate itemTemplate in _itemTemplates)
            {
                BehaviorKey key = itemTemplate.Key;

                if (itemTemplate.State == DefaultBehaviorState.DisabledWithoutFactory)
                {
                    config.Append(key);
                }
                else
                {
                    IBehavior instance = factory.Create(key);
                    config.Append(key, instance);

                    if (itemTemplate.State == DefaultBehaviorState.Enabled)
                    {
                        config.Enable(key);
                    }
                }
            }

            return(config);
        }
        internal static BehaviorChainConfiguration GetConfiguration(
            BehaviorChainTemplateKey templateKey,
            IBehaviorFactoryConfiguration factoryConfiguration
            )
        {
            var template = BehaviorChainTemplateRegistry.GetTemplate(templateKey);

            return(template.CreateConfiguration(factoryConfiguration));
        }
        public IVMPropertyDescriptor <TValue> CustomProperty <TValue>(
            BehaviorChainTemplateKey templateKey,
            IBehaviorFactoryConfiguration factoryConfiguration,
            Action <BehaviorChainConfiguration> chainConfigurationAction
            )
        {
            var config = BehaviorChainConfiguration.GetConfiguration(templateKey, factoryConfiguration);

            chainConfigurationAction(config);
            return(CustomProperty <TValue>(config));
        }
        private IVMPropertyDescriptor <TValue> CustomProperty <TValue>(
            BehaviorChainTemplateKey templateKey,
            IBehaviorFactoryConfiguration factoryConfiguration,
            Action <BehaviorChainConfiguration> chainConfigurationAction,
            Action <BehaviorChainConfiguration> userChainConfigurationAction
            )
        {
            return(CustomProperty <TValue>(
                       templateKey,
                       factoryConfiguration,
                       config => {
                chainConfigurationAction(config);

                if (userChainConfigurationAction != null)
                {
                    userChainConfigurationAction(config);
                }
            }
                       ));
        }