public static void ExtractVariables(AbstractTemplateElement element, IDictionary <string, ExtractedVariable> variables, VariableExtractionParms parms)
        {
            if (m_CommandSerializers == null)
            {
                m_CommandSerializers = InitCommandSerializers();
            }

            if (!m_CommandSerializers.ContainsKey(element.GetType()))
            {
                throw new ArgumentOutOfRangeException(nameof(element), $"ElementType {element.GetType()} not serializable");
            }

            var typeInfo = m_CommandSerializers[element.GetType()];
            var ctor     = typeInfo.VariableExtractor.GetConstructor(Type.EmptyTypes);
            var instance = (AbstractVariableExtractor)ctor?.Invoke(new object[0]);

            if (instance == null)
            {
                throw new ArgumentOutOfRangeException(nameof(element), $"Serializer for {element.GetType()} not instanciable");
            }

            instance.Initialize(element, parms);
            instance.ExtractVariables(variables);
        }
        public static IDictionary <string, ExtractedVariable> ExtractVariables(AbstractTemplateElement element, VariableExtractionParms parms = null)
        {
            var variables = new Dictionary <string, ExtractedVariable>();

            var extractor = new VariableExtractor();

            extractor.Initialize(element, parms ?? new VariableExtractionParms());
            extractor.ExtractVariables(variables);

            return(variables.Where(x => !x.Value.IsLocal).ToDictionary(x => x.Key, x => x.Value));
        }