public YieldSummary GetYieldOfCell(IHexCell cell, ICivilization perspectiveCiv)
        {
            if (cell == null)
            {
                throw new ArgumentNullException("cell");
            }

            YieldSummary retval         = YieldSummary.Empty;
            ICity        cityOwningCell = CellPossessionCanon.GetOwnerOfPossession(cell);

            retval += InherentYieldLogic.GetInherentCellYield(cell, false);

            var nodeAtLocation = NodePositionCanon.GetPossessionsOfOwner(cell).FirstOrDefault();

            var visibleResources = TechCanon.GetResourcesVisibleToCiv(perspectiveCiv);

            var improvementOnCell = ImprovementLocationCanon.GetPossessionsOfOwner(cell).FirstOrDefault();

            var discoveredTechs = TechCanon.GetTechsDiscoveredByCiv(perspectiveCiv);

            bool hasFreshWater = FreshWaterCanon.HasAccessToFreshWater(cell);

            if (cityOwningCell != null)
            {
                var buildingsOnCell = BuildingPossessionCanon.GetPossessionsOfOwner(cityOwningCell)
                                      .Select(building => building.Template);

                retval += BuildingYieldLogic.GetBonusCellYieldFromBuildings(cell, buildingsOnCell);
            }

            if (nodeAtLocation != null)
            {
                retval += NodeYieldLogic.GetYieldFromNode(nodeAtLocation, visibleResources, improvementOnCell);
            }

            if (improvementOnCell != null)
            {
                retval += ImprovementYieldLogic.GetYieldOfImprovement(
                    improvementOnCell, nodeAtLocation, visibleResources, discoveredTechs, hasFreshWater
                    );
            }

            if (perspectiveCiv != null && GoldenAgeCanon.IsCivInGoldenAge(perspectiveCiv) && retval[YieldType.Gold] > 0f)
            {
                retval[YieldType.Gold] += CivConfig.GoldenAgeBonusGoldOnCells;
            }

            return(retval);
        }