package interestingExplorationsWithInnerClasses;

public class Outer {
	private String outerName = "Oscar Outer";
	
	private StaticInnerPublic a = new StaticInnerPublic();
	private StaticInnerPrivate b = new StaticInnerPrivate();
	private StaticInnerPrivateInherited b2 = new StaticInnerPrivateInherited();
	
	private InnerPublic c = new InnerPublic();
	private InnerPrivate d = new InnerPrivate();
	
	// Anonymous
	private Object e = new Object() {
		/* private Anon e = new Anon() will not work
		/* If you try to make a private Anon e, will not compile --
		 * unless there is an Anon class developed that you can reference
		 */
		private String innerName = "Annie Inner";
		public int age = 15;
		
		public String getInnerName() {
			return innerName;
		}

		public void setInnerName(String innerName) {
			this.innerName = innerName;
		}
	};

	// Anonymous
	public Object f = new Object() {
		private String innerName = "Andrew Inner";
		public int age = 62;
		
		public String getInnerName() {
			return innerName;
		}

		public void setInnerName(String innerName) {
			this.innerName = innerName;
		}
	};
	
	// The Inner class definitions
	
	public static class StaticInnerPublic {
		// A named static public inner class
		private String innerName = "Stacy Inner";
		public int age = 21;

		public String getInnerName() {
			return innerName;
		}

		public void setInnerName(String innerName) {
			this.innerName = innerName;
		}
	}
	
	private static class StaticInnerPrivate {
		// A named static private inner class
		private String innerName = "Stan Inner";
		public int age = 23;
		
		public String getInnerName() {
			return innerName;
		}

		public void setInnerName(String innerName) {
			this.innerName = innerName;
		}
	}
	
	// Private classes are so hard for clients to work with
	// Can an inner class inherit from a parent class?
	private static class StaticInnerPrivateInherited 
			extends DummyClassWithInnerNameAndAge {
		// A named static private inner class
		private String innerName = "Stan Inner";
		public int age = 23;
		
		public String getInnerName() {
			return innerName;
		}

		public void setInnerName(String innerName) {
			this.innerName = innerName;
		}
		
		public int getAge() {
			return age;
		}
	}
	
	public class InnerPublic {
		// A named public inner class
		private String innerName = "Inez Inner";
		public int age = 27;
		
		public String getInnerName() {
			return innerName;
		}

		public void setInnerName(String innerName) {
			this.innerName = innerName;
		}
	}
	
	private class InnerPrivate {
		// A named private inner class
		private String innerName = "Ingrid Inner";
		public int age = 31;
		
		public String getInnerName() {
			return innerName;
		}

		public void setInnerName(String innerName) {
			this.innerName = innerName;
		}
	}

	// Outer class GETTERS
	public String getOuterName() {
		return outerName;
	}

	public StaticInnerPublic getA() {
		return a;
	}

	public StaticInnerPrivate getB() {
		return b;
	}
	
	public StaticInnerPrivateInherited getB2() {
		return b2;
	}

	public InnerPublic getC() {
		return c;
	}

	public InnerPrivate getD() {
		return d;
	}

	public Object getE() {
		return e;
	}

	public Object getF() {
		return f;
	}
	
}
