Using the DSL API and Groovy Classes
Once your IDE is configured correctly you can further enhance the development experience by using a strongly typed version of the Platform 6 DSL.
This will allow the IDE to suggest and auto-complete on DSL methods as required.
Typed P6 DSL are available in two versions for:
Script
/**
 * Turn the untyped 'p6' binding into a typed DSL for better IDE integration
 */
import io.platform6.core.dsl.TypedP6Dsl
def p6 = new TypedP6Dsl(p6)
p6.log.debug 'Hello World'
Route
/**
 * Turn the untyped 'p6' binding into a typed DSL for better IDE integration
 */
import io.platform6.core.dsl.TypedP6RouteDsl
def p6 = new TypedP6RouteDsl(p6)
p6.log.debug 'Hello World'
In the above example I transform the untyped p6 binding into a TypedP6Dsl which allows the IDE to assist the developer when using the DSL.
Note
Although the TypedP6Dsl primary purpose is to provide help to the developer and their IDE, there is little or no runtime penalty for using the typed p6 everywhere
TypedP6Dsl and local Classes¶
Here is an example of a local class I create in script module IDEDemoMain:
package io.platform6.app.core.scripts.idedemomain
import io.platform6.core.dsl.TypedP6Dsl
class MyLocalClass {
    TypedP6Dsl p6
    MyLocalClass(TypedP6Dsl p6) {
        this.p6 = p6
    }
    def sayHello(){
        p6.log.debug 'Hello from MyLocalClass'
    }
}
TypedP6Dsl rather than an untyped binding, the IDE syntax checking is more complete
Note
Because I have auto packaging disabled I am using package and import statements enabling the IDE to better manage my code
This class can be instantiated and called as follows:
package io.platform6.app.core.scripts.idedemomain
import io.platform6.core.dsl.TypedP6Dsl
def p6 = new TypedP6Dsl(p6)
new MyLocalClass(p6).sayHello()
TypedP6Dsl and library classes¶
Here is an example of a script module class I created for use from many other scripts; a library class:
package io.platform6.app.core.scripts.idedemolib
import io.platform6.core.dsl.TypedP6Dsl
class MyLibClass {
    TypedP6Dsl p6
    MyLibClass(TypedP6Dsl p6) {
        this.p6 = p6
    }
    def sayHello(){
        p6.log.debug 'Hello from MyLibClass'
    }
}
Again I’m passing a typed DSL instance to the library class MyLibClass in module IDEDemoLib
This class can be instantiated and called as follows:
/**
 * Sample Groovy script for development in an IDE using an example library of classes
 *
 * @include IDEDemoLib
 *
 */
package io.platform6.app.core.scripts.idedemomain
import io.platform6.app.core.scripts.idedemolib.MyLibClass
import io.platform6.core.dsl.TypedP6Dsl
def p6 = new TypedP6Dsl(p6)
new MyLibClass(p6).sayHello()
Here I use the @include keyword to include the IDEDemoLib module when I build.  I must use import to correctly include a reference to this library class
By using package structures and enabling Gradle to build all /src/main/groovy code onto the classpath, IntelliJ is able to suggest and insert import statements as required
Here is a view of this example code in the IntelliJ project tree:
  