Usecase of lazily evaluated properties

Hi,

in the documentation there is the notion of Mapping extension properties to task properties, but it only shows statically evaluated String value.

I wrote example with lazy evaluation and want to hear if there i anything that can be improved in he following code. Thanks!

apply plugin: PropertyUsecasePlugin

class PropertyUsecasePlugin implements Plugin<Project> {
    void apply(Project project) {
        def extension = project.extensions.create('propertyUsecase', PropertyUsecaseExtension, project)

        project.tasks.create('useCase', UsecaseTask) {
            message    = extension.message
            systemProp = extension.systemProp
        }
    }
}

class PropertyUsecaseExtension {
    final PropertyState<String> message
    final PropertyState<String> systemProp

    PropertyUsecaseExtension(Project project) {
        message    = project.property(String)
        systemProp = project.property(String)

        message.set('default message value')
        systemProp.set('default system prop')
    }

    void setMessage(Provider<String> message) {
        this.message.set(message)
    }

    void setSystemProp(Provider<String> systemProp) {
        this.systemProp.set(systemProp)
    }
}

class UsecaseTask extends DefaultTask {
    final PropertyState<String> message    = project.property(String)
    final PropertyState<String> systemProp = project.property(String)

    void setMessage(PropertyState<String> message) {
        this.message.set(message)
    }

    void setSystemProp(PropertyState<String> systemProp) {
        this.systemProp.set(systemProp)
    }

    @TaskAction
    void printMessage() {
        println message   .get()
        println systemProp.get()
    }
}

def value = 1
System.setProperty('lala', '123')

propertyUsecase {
    message    = provider { println "Calling closure"; 'trala' + value }
    systemProp = provider { System.getProperty('lala') }
}

value = 2
System.setProperty('lala', '456')