On Apr 17, 2009, at 1:13 AM, Adam Murdoch wrote:

Hi,

I'm not entirely happy with some of the semantics and API for our events, and I'd like to tidy this up before 0.6. In trunk, we have:

* Project evaluation events

- You use a ProjectEvaluationListener which you add to a Project
- Fires beforeEvaluate(project) and afterEvaluate(project) events
- afterEvaluate() is not fired when project evaluation fails

* Task execution events

- You use a TaskExecutionListener which you add to a TaskGraph
- Fires beforeExecute(task) and afterExecute(task, exception) events
- afterExecute() is fired whether the task succeeds or fails.

Some things I don't like about this:

- The task and project 'after' events have different semantics regarding when they are/are not fired

- Some times you want the 'after' event to be fired regardless of success or failure, such as when you are doing some custom logging, or profiling, or building a UI.

- Some times you want the 'after' event to be fired only on success, such as when you are doing some additional configuration at the end of project evaluation

- Often you are only interested in the 'after' event

What I'd like to change:

1. Change ProjectEvaluationListener.afterEvaluate() to have the same semantics as TaskEvaluationListener.afterExecute()

2. Move the use of ProjectEvaluationListener from Project to Build.

3. Use ProjectAction as another notification mechanism for the project evaluation events. That is, add

Project.beforeEvaluate(ProjectAction)
Project.afterEvaluate(ProjectAction)

The later would only be fired on successful evaluation.

I like all those proposed changes.

* Task creation event

Currently you use a TaskLifecycleListener which you add to a Project. It has a single taskAdded() event

One problem with this approach is that often you want to do exactly the same stuff to both existing tasks and new tasks, and it's a little odd to be using a listener for applying an action to existing tasks.

I was thinking about use cases for such scenarios. One common use case, where you usually want to have 'after' configuration is when the parent project adds tasks to the subprojects and a particular subproject adds a specific plugin. So I think 'after' configuration should be the default. We might run into use cases where 'after' configuration is not wanted or where any plugin configuration of tasks is not wanted. But let's wait and see. Any configuration can be overwritten, so we don't lock anyone in with such a default.

So, I'd like to do away with TaskLifecycleListener and replace it with TaskAction. That is, add

Project.whenTaskAdded(TaskAction)

Then, we can (later) add a method like Project.allTasks(TaskAction) which can be passed exactly the same action as the listener method.

Thoughts?

Very cool.

- Hans

--
Hans Dockter
Gradle Project lead
http://www.gradle.org





---------------------------------------------------------------------
To unsubscribe from this list, please visit:

   http://xircles.codehaus.org/manage_email


Reply via email to