public static function difference($array)
    {
        if (empty($array))
            return [];

        if (func_num_args() == 1)
            return $array;

        $args = func_get_args();

        if (static::every($args, 'is_array'))
            return array_values(call_user_func_array('array_diff', $args));

        $rest = static::flatten(array_slice($args, 1), true);
        return static::values(static::filter($array, function($value) use ($rest) {
            return !static::contains($rest, $value);
        }));
    }