public ProductionInstanceBuilder(ParserProduction parserProduction, ProductionInstanceBuilderPool pool)
                {
                    var binder = parserProduction.Binder;

                    _pool      = pool;
                    _tryReturn = binder.TryReturn;

                    if (binder.ConstValue != null)
                    {
                        Arguments = Array.Empty <Argument>();

                        _constValue             = binder.ConstValue;
                        _createInstanceDelegate = (builder, factory) => builder._constValue;
                    }
                    else
                    {
                        var template = binder.Template;

                        Arguments        = new Argument[template.Length];
                        ArgumentBuilders = binder.Template;

                        for (var index = 0; index < template.Length; index++)
                        {
                            var argumentBuilder = template[index];

                            if (argumentBuilder == null)
                            {
                                continue;
                            }

                            Arguments[index] = argumentBuilder.CreateArgument(this, index);
                        }

                        var flatIndex = parserProduction.LeftRecursionEntry?.ParserEntryData.FlatIndex ?? -1;

                        LeftRecursionArgument = flatIndex != -1 ? Arguments[flatIndex] : null;

                        _createInstanceDelegate = binder.CreateInstanceDelegate;
                    }
                }