import java.lang.reflect.Constructor;

public class Master
{
	public Master()
	{
		System.out.println( "Master >> " + this.getClass().getName() );
	}
	
	public interface IJob {
		IJob getJob();
	}
	
	public class JobDecorator implements IJob
	{
		private IJob job;
		
		@Override
		public IJob getJob() {
			return job;
		}
		
		public JobDecorator( Master master )
		{
			Class<? extends Master> master_class = master.getClass();
			String job_class_name = master_class.getName() + "$Job";
			
			try {
				Class<? extends IJob> job_class = 
						(Class<? extends IJob>) Class.forName( job_class_name );
				
				Constructor<? extends IJob> job_constructor =
						job_class.getConstructor( master_class );
				
				this.job = job_constructor.newInstance( master );
			} catch ( ClassNotFoundException e ) {
				// TODO: find Job in super class
				e.printStackTrace();
			} catch ( Exception e ) {
				System.err.println( "Can not construct " + job_class_name + " object." );
				e.printStackTrace();
			}
		}
	}
	
	public class Job implements IJob
	{
		public Job()
		{
			System.out.println( "Master.Job >> " + getJob().getClass().getName() );
		}

		@Override
		public IJob getJob() {
			return this;
		}
	}
}