When a task is invoked, first we check to see if it has been invoked before. if it has been, then nothing else is done. If this is the first time its been invoked, then we invoke each of its prerequisites. Finally, we check to see if we need to execute the actions of this task by calling needed?. Finally, if the task is needed, we execute its actions. NOTE: Currently prerequisites are invoked even if the task is not needed. This may change in the future.