class ChangeExecListenerCommandStep extends AbstractHelperCommandStep {

    protected static final String[] COMMAND_NAME = {"changeExecListener"};

    public static final CommandArgumentDefinition<String> CHANGE_EXEC_LISTENER_CLASS_ARG;
    public static final CommandArgumentDefinition<String> CHANGE_EXEC_LISTENER_PROPERTIES_FILE_ARG;
    public static final CommandArgumentDefinition<ChangeExecListener> CHANGE_EXEC_LISTENER_ARG;

    static {
        CommandBuilder builder = new CommandBuilder(COMMAND_NAME);
        CHANGE_EXEC_LISTENER_CLASS_ARG = builder.argument("changeExecListenerClass", String.class)
                .description("Fully-qualified class which specifies a ChangeExecListener").build();
        CHANGE_EXEC_LISTENER_PROPERTIES_FILE_ARG = builder.argument("changeExecListenerPropertiesFile", String.class)
                .description("Path to a properties file for the ChangeExecListenerClass").build();
        CHANGE_EXEC_LISTENER_ARG = builder.argument("changeExecListener", ChangeExecListener.class)
                .hidden().build();
    }

    @Override
    public List<Class<?>> providedDependencies() {
        return Collections.singletonList(ChangeExecListener.class);
    }

    @Override
    public List<Class<?>> requiredDependencies() {
        return Collections.singletonList(Database.class);
    }

    @Override
    public void run(CommandResultsBuilder resultsBuilder) throws Exception {<FILL_FUNCTION_BODY>}

    /**
     * Set up a "chain" of ChangeExecListeners. Starting with the custom change exec listener
     * then wrapping that in the DefaultChangeExecListener.
     */
    private DefaultChangeExecListener getChangeExecListener(CommandScope commandScope, Database database) throws Exception {
        DefaultChangeExecListener changeExecListener = new DefaultChangeExecListener();
        ChangeExecListener listener = ChangeExecListenerUtils.getChangeExecListener(database,
                Scope.getCurrentScope().getResourceAccessor(),
                commandScope.getArgumentValue(CHANGE_EXEC_LISTENER_CLASS_ARG),
                commandScope.getArgumentValue(CHANGE_EXEC_LISTENER_PROPERTIES_FILE_ARG));
        changeExecListener.addListener(listener);
        return changeExecListener;
    }

    @Override
    public String[][] defineCommandNames() {
        return new String[][] { COMMAND_NAME };
    }

}

        CommandScope commandScope = resultsBuilder.getCommandScope();
        Database database = (Database) commandScope.getDependency(Database.class);

        commandScope.provideDependency(ChangeExecListener.class,
                commandScope.getArgumentValue(CHANGE_EXEC_LISTENER_ARG) != null ?
                        commandScope.getArgumentValue(CHANGE_EXEC_LISTENER_ARG) :
                        this.getChangeExecListener(commandScope, database));
    
<methods>public non-sealed void <init>() ,public void adjustCommandDefinition(liquibase.command.CommandDefinition) <variables>