@Override
    public final KernelAssign assign(IVariable variable, KernelParam val) {
        if (variable instanceof LocalVariable) {
            return OperatorFactory.newOperator(LocalVariableAssigner.class, new Class<?>[] {
                    KernelProgramBlock.class, LocalVariable.class, KernelParam.class }, getExecutor(), variable,
                    val);
        } else if (variable instanceof StaticGlobalVariable) {
            return OperatorFactory.newOperator(StaticGlobalVariableAssigner.class, new Class<?>[] {
                    KernelProgramBlock.class, StaticGlobalVariable.class, KernelParam.class }, getExecutor(),
                    variable, val);
        } else if (variable instanceof NonStaticGlobalVariable) {
            return OperatorFactory.newOperator(NonStaticGlobalVariableAssigner.class, new Class<?>[] {
                    KernelProgramBlock.class, NonStaticGlobalVariable.class, KernelParam.class }, getExecutor(),
                    variable, val);
        } else {
            throw new IllegalArgumentException("Can't assign value to variable : " + variable.getName());
        }
    }