/// <summary>
        /// Converts this IGEPChromosome to its corresponding IDebuggableChromosome. An IDebuggableChromosome is an IChromosome that 
        /// treats the IChromosome's IGenes as a "program". An IDebuggableChromosome can be "stepped" into.
        /// </summary>
        /// <returns></returns>
        public IDebuggableChromosome ToDebuggableChromosome(IGEPChromosomeSurroundings surroundings)
        {
            this.LocalGlobalRegistry.Clear();

            var debuggableMain = this.Main.ToDebuggableGene(new GEPGeneSurroundings(surroundings, this.CreateGeneExecutionDataDictionary()));
            return new DebuggableChromosome(debuggableMain);
        }
        /// <summary>
        /// Given the IGEPChromosome's immediate surroundings (i.e. the "input"), 
        /// "Runs" the IGEPChromosome which results in its Behavior (i.e. the "ouput").
        /// </summary>
        /// <returns></returns>
        public virtual IGEPChromosomeBehavior Behave(IGEPChromosomeSurroundings surroundings)
        {
            this.LocalGlobalRegistry.Clear();

            var geneBehavior = this.Main.Behave(new GEPGeneSurroundings(chromosomeSurroundings: surroundings,
                                                     geneExecutionDataDictionary:
                                                         this.CreateGeneExecutionDataDictionary()));
            return new GEPChromosomeBehavior(success: geneBehavior.Success);
        }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="chromosomeSurroundings">The data passed to the parent IGEPChromosome.</param>
 /// <param name="geneExecutionDataDictionary">The IGeneExecutionData for each IGEPGene in the parent IGEPOrganism.</param>
 public GEPGeneSurroundings(IGEPChromosomeSurroundings chromosomeSurroundings, 
     IDictionary<IGeneIdentifier, IGeneExecutionData> geneExecutionDataDictionary) 
     : base(chromosomeSurroundings, geneExecutionDataDictionary)
 {
 }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="chromosomeSurroundings">The data passed to the parent IGEPChromosome.</param>
 /// <param name="geneExecutionDataDictionary">The IGeneExecutionData for each IGEPGene in the parent IGEPOrganism.</param>
 protected GEPGeneSurroundingsBase(IGEPChromosomeSurroundings chromosomeSurroundings,
     IDictionary<IGeneIdentifier, IGeneExecutionData> geneExecutionDataDictionary) 
     : base(chromosomeSurroundings)
 {
     this.GeneExecutionDataDictionary = geneExecutionDataDictionary;
 }