private static void Grid_RailRemoved(RailArgs railArgs)
        {
            Rail rail = railArgs.Rail as Rail;

            if (rail != null)
            {
                rail.RailUpdated -= rail_RailUpdated;
            }
        }
        private static void Grid_RailAdded(RailArgs railArgs)
        {
            IRail iRail = railArgs.Rail;

            if (iRail == null)
            {
                return;
            }
            Rotation[]   sides   = railArgs.Sides;
            TrainNetwork network = null;

            foreach (Rotation rot in sides)
            {
                GridObject go = _grid[RailUtils.GetOffsetForRotation(rot, railArgs.RawObject.Location)];
                if (go == null || go == iRail)
                {
                    continue;
                }
                IRail rail2 = go as IRail;
                if (rail2 == null)
                {
                    continue;
                }
                TrainNetwork newNetwork = GetNetworkForRail(rail2);
                if (network == null)
                {
                    if (RailUtils.DoRailsAttach(railArgs.RawObject, go))
                    {
                        network = newNetwork;
                        network.Add(iRail);
                    }
                }
                else if (newNetwork != network)
                {
                    network = CombineNetwork(network, newNetwork);
                }
            }
            if (network == null)
            {
                TrainNetwork newNetwork = new TrainNetwork(); //No need to register the object, it does so himself in its constructor
                newNetwork.Add(iRail);
            }
            Rail rail = iRail as Rail;

            if (rail != null)
            {
                rail.RailUpdated += rail_RailUpdated;
            }
        }
        static void rail_RailUpdated(RailArgs args)
        {
            Rotation[]   sides   = args.Sides;
            TrainNetwork network = GetNetworkForRail(args.Rail);

            foreach (Rotation side in sides)
            {
                GameObject go = _grid[RailUtils.GetOffsetForRotation(side, args.RawObject.Location)];
                if (go == null)
                {
                    continue;
                }
                IRail rail = go as IRail;
                if (rail == null)
                {
                    continue;
                }
                TrainNetwork compareNetwork = GetNetworkForRail(rail);
                if (network != compareNetwork)
                {
                    CombineNetwork(network, compareNetwork);
                }
            }
        }