NAnt Define Tasks allows you to define NAnt tasks in terms of other NAnt tasks, instead of having to write any C# code.
You write a new task like this:
...and then you call it like this:<echo3 message="Hello World" />
Any parameter (e.g. 'message') passed to the defined task is available as (e.g.) this.message inside the defined task. I've found it useful when you don't want to write a task in C#, perhaps because all you're doing is calling a bunch of other NAnt tasks.
Note that this project is not affiliated with the NAnt project or the NAntContrib project. It's just something I wrote and then found useful.