package com.github.atemerev.hollywood.jekyll; import com.github.atemerev.hollywood.Actor; import com.github.atemerev.hollywood.Hollywood; import com.github.atemerev.hollywood.annotations.AllowedStates; import com.github.atemerev.hollywood.annotations.Initial; import com.github.atemerev.hollywood.annotations.State; /** * @author Alexander Temerev */ public abstract class JekyllHyde extends Actor { public static JekyllHyde create() { return Hollywood.createActor(JekyllHyde.class); } // public interface public abstract String say(); public abstract void transform(); public abstract String say(String arg); @AllowedStates(Hyde.class) public abstract void killAllHumans(); // states @Initial @State public static abstract class Jekyll extends JekyllHyde { public String say() { return "My name is Jekyll, I am a Ph.D. in chemistry."; } public String say(String arg) { return arg.toLowerCase(); } public synchronized void transform() { setState(Hyde.class); } } @State public static abstract class Hyde extends JekyllHyde { public String say() { return "AAAAAAARRRRRRRGGMMMHHH!!!!11"; } public synchronized void transform() { setState(Jekyll.class); } public void killAllHumans() { System.out.println("Silence! I'll kill you!"); } public String say(String arg) { return arg.toUpperCase(); } } }