src/main/java/com/github/oxo42/stateless4j/StateConfiguration.java
public <TArg0, TArg1, TArg2> StateConfiguration<S, T> permitDynamicIf(TriggerWithParameters3<TArg0, TArg1, TArg2, T> trigger,
                                                                          final Func4<TArg0, TArg1, TArg2, S> destinationStateSelector, FuncBoolean guard, final Action3<TArg0, TArg1, TArg2> action) {
        assert trigger != null : TRIGGER_IS_NULL;
        assert destinationStateSelector != null : DESTINATION_STATE_SELECTOR_IS_NULL;
        return publicPermitDynamicIf(
                trigger.getTrigger(), new Func2<Object[], S>() {
                    @SuppressWarnings("unchecked")

                    @Override
                    public S call(Object[] args) {
                        return destinationStateSelector.call(
                                (TArg0) args[0],
                                (TArg1) args[1],
                                (TArg2) args[2]
                        );
                    }
                }, guard, new Action1<Object[]>() {
                    @SuppressWarnings("unchecked")
                    @Override
                    public void doIt(Object[] args) {
                        action.doIt(
                                (TArg0) args[0],
                                (TArg1) args[1],
                                (TArg2) args[2]);
                    }
                }
        );
    }
public <TArg0, TArg1, TArg2> StateConfiguration<S, T> permitDynamicIf(TriggerWithParameters3<TArg0, TArg1, TArg2, T> trigger,
                                                                          final Func4<TArg0, TArg1, TArg2, S> destinationStateSelector, FuncBoolean guard, final Action3<TArg0, TArg1, TArg2> action) {
        assert trigger != null : TRIGGER_IS_NULL;
        assert destinationStateSelector != null : DESTINATION_STATE_SELECTOR_IS_NULL;
        return publicPermitDynamicIf(
                trigger.getTrigger(), new Func2<Object[], S>() {
                    @SuppressWarnings("unchecked")

                    @Override
                    public S call(Object[] args) {
                        return destinationStateSelector.call(
                                (TArg0) args[0],
                                (TArg1) args[1],
                                (TArg2) args[2]
                        );
                    }
                }, guard, new Action1<Object[]>() {
                    @SuppressWarnings("unchecked")
                    @Override
                    public void doIt(Object[] args) {
                        action.doIt(
                                (TArg0) args[0],
                                (TArg1) args[1],
                                (TArg2) args[2]);
                    }
                }
        );
    }
Accept the specified trigger and transition to the destination state, calculated dynamically by the supplied
function.
<p>
Additionally a given action is performed when transitioning. This action will be called after
the onExit action of the current state and before the onEntry action of the destination state.
The parameters of the trigger will be given to this action.

@param trigger                  The accepted trigger
@param destinationStateSelector Function to calculate the state that the trigger will cause a transition to
@param guard                    Function that must return true in order for the  trigger to be accepted
@param action                   The action to be performed "during" transition
@param <TArg0>                  Type of the first trigger argument
@param <TArg1>                  Type of the second trigger argument
@param <TArg2>                  Type of the third trigger argument
@return The receiver