Resurrecting this as I have a story for it.

On 04/02/2013, at 5:04 PM, Luke Daley <[email protected]> wrote:

> Hi,
> 
> I'm working on a spec for implicit file value coercion. This will likely 
> yield some more general stuff for implicit type coercion, but the focus is 
> for file values. There are a few tricky problems.
> 
> In order to support “flexible input values” for files right now, you need to 
> do effectively this…
> 
> class MyTask extends DefaultTask {
> 
>       Object someFile
> 
>       File getSomeFile() {
>               someFile == null : null : project.file(someFile)
>       }
> }
> 
> This allows (among other values) (1) …
> 
> task myTask(type: MyTask) {
>  someFile "path/to/file"
> }
> 
> And (2):
> 
> task myTask(type: MyTask) {
>  someFile { someLazilyEvaluatedValue }
> }
> 
> We want to avoid developers having to do this manually for a few reasons. 
> Developers should be able to just write the following and get the same 
> behaviour:
> 
> class MyTask extends DefaultTask {
>       File someFile
> }
> 
> If we ignore #2 for the time being, we could do this by injecting a coercion 
> layer in the MOP. We would effectively intercept *every* method call, if it's 
> a coercible case then coerce the value and just call through to the declared 
> setter. That's actually quite a big change as it flips the relationship 
> around between the Groovy MOP and ours, but it's ultimately doable I think.

I was wrong here. We already route every method call through our MOP (of 
course) so this isn't a big deal.

> #2 provides lazy evaluation because the closure gets stored and evaluated on 
> demand by project.file() in the getter. If we decide that this story 
> (implicit file value coercion) means supporting this usage, then we are 
> forced to answer some uncomfortable questions about laziness and what we call 
> convention mapping. 
> 
> Options:
> 
> 1. Do not support deferring with this feature, all values are coerced 
> immediately.
> 2. Do support deferring, ultimately meaning on-demand coercion
> 
> I'm not sure how much of an option #1 actually is, given how widespread the 
> use of this feature is.
> 
> If we go with #2, what do we do about the crossover with convention mapping? 
> How much of that needs to be considered for this story? if we completely 
> ignore it and add another layer, we'd now have two different out-of-object 
> places that object data is stored. It starts to look like we should look at 
> some convergence here. If so, that raises the question of whether we can 
> change any convention mapping API without a deprecation cycle (if it turns 
> out we need to). 

I think for now we can ignore #2 until we have a clearer answer on where we are 
going with this. 

-- 
Luke Daley
Principal Engineer, Gradleware 
http://gradleware.com

Join me at the Gradle Summit 2013, June 13th and 14th in Santa Clara, CA: 
http://www.gradlesummit.com


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

    http://xircles.codehaus.org/manage_email


Reply via email to