using System;
 
namespace DoFactory.GangOfFour.Memento.RealWorld
{
	/// 
	/// MainApp startup class for Real-World 
	/// Memento Design Pattern.
	/// 
  class MainApp
  {
	/// 
	/// Entry point into console application.
	/// 
    static void Main()
    {
      SalesProspect s = new SalesProspect();
      s.Name = "Noel van Halen";
      s.Phone = "(412) 256-0990";
      s.Budget = 25000.0;
 
      // Store internal state
      ProspectMemory m = new ProspectMemory();
      m.Memento = s.SaveMemento();
 
      // Continue changing originator
      s.Name = "Leo Welch";
      s.Phone = "(310) 209-7111";
      s.Budget = 1000000.0;
 
      // Restore saved state
      s.RestoreMemento(m.Memento);
 
      // Wait for user
      Console.ReadKey();
    }
  }
 
	/// 
	/// The 'Originator' class
	/// 
  class SalesProspect
  {
    private string _name;
    private string _phone;
    private double _budget;
 
    // Gets or sets name
    public string Name
    {
      get { return _name; }
      set
      {
        _name = value;
        Console.WriteLine("Name:  " + _name);
      }
    }
 
    // Gets or sets phone
    public string Phone
    {
      get { return _phone; }
      set
      {
        _phone = value;
        Console.WriteLine("Phone: " + _phone);
      }
    }
 
    // Gets or sets budget
    public double Budget
    {
      get { return _budget; }
      set
      {
        _budget = value;
        Console.WriteLine("Budget: " + _budget);
      }
    }
 
    // Stores memento
    public Memento SaveMemento()
    {
      Console.WriteLine("\nSaving state --\n");
      return new Memento(_name, _phone, _budget);
    }
 
    // Restores memento
    public void RestoreMemento(Memento memento)
    {
      Console.WriteLine("\nRestoring state --\n");
      this.Name = memento.Name;
      this.Phone = memento.Phone;
      this.Budget = memento.Budget;
    }
  }
 
	/// 
	/// The 'Memento' class
	/// 
  class Memento
  {
    private string _name;
    private string _phone;
    private double _budget;
 
    // Constructor
    public Memento(string name, string phone, double budget)
    {
      this._name = name;
      this._phone = phone;
      this._budget = budget;
    }
 
    // Gets or sets name
    public string Name
    {
      get { return _name; }
      set { _name = value; }
    }
 
    // Gets or set phone
    public string Phone
    {
      get { return _phone; }
      set { _phone = value; }
    }

    // Gets or sets budget
    public double Budget
    {
      get { return _budget; }
      set { _budget = value; }
    }
  }
 
	/// 
	/// The 'Caretaker' class
	/// 
  class ProspectMemory
  {
    private Memento _memento;
 
    // Property
    public Memento Memento
    {
      set { _memento = value; }
      get { return _memento; }
    }
  }
}