import java.util.ArrayList; class Task implements TaskWatcher { private String name; private int minutes; private ArrayList watchers; private ArrayList prereqs; private boolean isComplete; public Task(String name, int minutes) { this.name = name; this.minutes = minutes; this.watchers = new ArrayList(); this.prereqs = new ArrayList(); this.isComplete = false; } public void addWatcher(TaskWatcher t) { this.watchers.add(t); } public void startIfStartable() { if (!this.isStartable() || this.isComplete) { return; } System.out.println(name + "...(" + this.minutes + " mins)..."); this.isComplete = true; for (TaskWatcher t: watchers) { t.taskComplete(this); } } private boolean isStartable() { for (Task p : prereqs) { if (!p.isComplete) { return false; } } return true; } public void taskComplete(Task t) { this.startIfStartable(); } public void addPrereq(Task t) { this.prereqs.add(t); t.addWatcher(this); } }