public static function prepare()
    {
        $orgArgs = func_get_args();

        if (count($orgArgs) < 2) {
            throw new \BadMethodCallException('Func::prepare requires at least two arguments. First should be the function to prepare followed by arguments for that function');
        }

        $func = array_shift($orgArgs);

        return function () use ($func, $orgArgs) {
            $additionalArgs = func_get_args();

            foreach ($orgArgs as $index => $arg) {
                if (is_null($arg)) {

                    $additionalArg = array_shift($additionalArgs);

                    if (is_null($additionalArg)) {
                        throw new \BadMethodCallException('Parameter mismatch detected for prepared function: ' . (string)$func);
                    }

                    $orgArgs[$index] = $additionalArg;
                }
            }

            return Func::call($func, $orgArgs);
        };
    }