public static function isEmpty($value)
    {
        if (!isset($value)) {
            return true;
        } elseif (is_bool($value)) {
            return false;
        } elseif ($value === 0) {
            return false;
        } elseif (empty($value)) {
            return true;
        } elseif (is_object($value) && method_exists($value, 'isEmpty')) {
            return $value->isEmpty();
        } elseif (static::isTraversable($value)) {
            foreach ($value as $k => $val) {
                if (!static::isEmpty($val)) {
                    return false;
                }
            }

            return true;
        }

        return false;
    }