# Dynamic commands

If you want even more control over your commands, they can also be added and removed at runtime by accessing the `CommandExecutor` class directly.

## Adding commands at runtime <a href="#adding-commands-at-runtime" id="adding-commands-at-runtime"></a>

Any delegate can be turned into a command using `CommandExecutor.AddCommand`. The method simply requires a name for the command, along with a delegate.

{% tabs %}
{% tab title="Action delegate" %}

```csharp
private void Start()
{
    // The method doesn't return anything, so we'll create an Action.
    CommandExecutor.AddCommand("hello", new Action<string>(Hello));
}

private void Hello(string message)
{
    Debug.Log(message);
}
```

{% endtab %}

{% tab title="Func delegate" %}

```csharp
private void Start()
{
    // The method returns a value, so we'll create Func in this case.
    CommandExecutor.AddCommand("multiply", new Func<int, int, int>(Multiply));
}

private int Multiply(int a, int b)
{
    return a * b;
}
```

{% endtab %}

{% tab title="Lambda expression" %}

```csharp
private void Start()
{
    // Alternatively you could create the delegate with a lambda expression. 
    CommandExecutor.AddCommand("hello", new Action<string>((string message) =>
    {
        Debug.Log(message);
    }));
}
```

{% endtab %}
{% endtabs %}

## Removing commands at runtime

Commands can also be removed at runtime. Even those that were created using the `[Command]` attribute. To do so, use `CommandExecutor.RemoveCommand`. The example below shows a great way to keep the player engaged for longer.

```csharp
CommandExecutor.RemoveCommand("quit");
```

{% hint style="info" %}
Note

If you've removed commands that were made using the `[Command]` attribute, such as any built-in command, you can restore all of them with `CommandExecutor.Scan()`.
{% endhint %}
