protected virtual PuppetLevel CloneForReal(PuppetLevelData newData) { var clone = (PuppetLevel)MemberwiseClone(); clone.Data = newData; if (newData.Head == null) { newData.Head = clone; } if (Parent is PuppetLevel parentClone) { parentClone = parentClone.CloneForReal(newData); clone.Parent = parentClone; } else { clone.Parent = newData; } return(clone); }
protected PuppetLevel Init(IPuppetLevel parent) { if (Parent != null) { throw new InvalidOperationException("Cannot be initialized twice"); } var tmp = parent; while (tmp is PuppetLevel casted) { if (tmp.GetType().IsAssignableFrom(GetType())) { throw new ArgumentException("All parents must be of different type"); } tmp = casted.Parent; } Parent = parent; Data = (PuppetLevelData)tmp; Data.Head = this; return(this); }