// Path: src/main/java/fabzo/kraken/components/InfrastructureComponent.java
// public abstract class InfrastructureComponent implements Named {
//     private ComponentState state = ComponentState.WAITING;
//     private List<Wait> waitFunctions = List.empty();
// 
//     public InfrastructureComponent withWait(final Wait waitFunc) {
//         this.waitFunctions = waitFunctions.append(waitFunc);
//         return this;
//     }
// 
//     public List<Wait> waitFuncs() {
//         return waitFunctions;
//     }
// 
//     public void setState(final ComponentState state) {
//         this.state = state;
//     }
// 
//     public ComponentState state() {
//         return state;
//     }
// }
// 
// Path: src/main/java/fabzo/kraken/handler/LifecycleHandler.java
// public interface LifecycleHandler {
// 
//     boolean canRun(final Class<? extends InfrastructureComponent> clazz);
// 
//     boolean run(final InfrastructureComponent component, final EnvironmentContext ctx);
// 
//     void stop(final InfrastructureComponent component, final EnvironmentContext ctx);
// }
// 
// Path: src/main/java/fabzo/kraken/EnvironmentContext.java
// public static final String IP_REF = "%s.ip";
// 
// Path: src/main/java/fabzo/kraken/EnvironmentContext.java
// public static final String PORT_REF_FROM = "%s.ports.%s.from";


import fabzo.kraken.components.InfrastructureComponent;
import fabzo.kraken.handler.LifecycleHandler;
import io.vavr.collection.List;
import static fabzo.kraken.EnvironmentContext.IP_REF;
import static fabzo.kraken.EnvironmentContext.PORT_REF_FROM;
package fabzo.kraken;



/**
 * Abstract environment module used to setup new test environments.
 * Provides methods for registering infrastructure components and runners
 * as well as setting configuration values.
 */
public abstract class EnvironmentModule {
    private List<InfrastructureComponent> components = List.empty();
// Path: src/main/java/fabzo/kraken/components/InfrastructureComponent.java
// public abstract class InfrastructureComponent implements Named {
//     private ComponentState state = ComponentState.WAITING;
//     private List<Wait> waitFunctions = List.empty();
// 
//     public InfrastructureComponent withWait(final Wait waitFunc) {
//         this.waitFunctions = waitFunctions.append(waitFunc);
//         return this;
//     }
// 
//     public List<Wait> waitFuncs() {
//         return waitFunctions;
//     }
// 
//     public void setState(final ComponentState state) {
//         this.state = state;
//     }
// 
//     public ComponentState state() {
//         return state;
//     }
// }
// 
// Path: src/main/java/fabzo/kraken/handler/LifecycleHandler.java
// public interface LifecycleHandler {
// 
//     boolean canRun(final Class<? extends InfrastructureComponent> clazz);
// 
//     boolean run(final InfrastructureComponent component, final EnvironmentContext ctx);
// 
//     void stop(final InfrastructureComponent component, final EnvironmentContext ctx);
// }
// 
// Path: src/main/java/fabzo/kraken/EnvironmentContext.java
// public static final String IP_REF = "%s.ip";
// 
// Path: src/main/java/fabzo/kraken/EnvironmentContext.java
// public static final String PORT_REF_FROM = "%s.ports.%s.from";


// Path: src/main/java/fabzo/kraken/EnvironmentModule.java
import fabzo.kraken.components.InfrastructureComponent;
import fabzo.kraken.handler.LifecycleHandler;
import io.vavr.collection.List;
import static fabzo.kraken.EnvironmentContext.IP_REF;
import static fabzo.kraken.EnvironmentContext.PORT_REF_FROM;

package fabzo.kraken;



/**
 * Abstract environment module used to setup new test environments.
 * Provides methods for registering infrastructure components and runners
 * as well as setting configuration values.
 */
public abstract class EnvironmentModule {
    private List<InfrastructureComponent> components = List.empty();
    private List<LifecycleHandler> handlers = List.empty();