Implemented and documented "joiner"

--HG--
branch : trunk
diff --git a/jinja2/defaults.py b/jinja2/defaults.py
index 61706ae..3e24e7d 100644
--- a/jinja2/defaults.py
+++ b/jinja2/defaults.py
@@ -8,7 +8,7 @@
     :copyright: 2007-2008 by Armin Ronacher.
     :license: BSD, see LICENSE for more details.
 """
-from jinja2.utils import generate_lorem_ipsum, Cycler
+from jinja2.utils import generate_lorem_ipsum, Cycler, Joiner
 
 
 # defaults for the parser / lexer
@@ -30,7 +30,8 @@
     'range':        xrange,
     'dict':         lambda **kw: kw,
     'lipsum':       generate_lorem_ipsum,
-    'cycler':       Cycler
+    'cycler':       Cycler,
+    'joiner':       Joiner
 }
 
 
diff --git a/jinja2/loaders.py b/jinja2/loaders.py
index 8b2221f..c61cd84 100644
--- a/jinja2/loaders.py
+++ b/jinja2/loaders.py
@@ -149,8 +149,14 @@
                 contents = f.read().decode(self.encoding)
             finally:
                 f.close()
-            old = path.getmtime(filename)
-            return contents, filename, lambda: path.getmtime(filename) == old
+
+            mtime = path.getmtime(filename)
+            def uptodate():
+                try:
+                    return path.getmtime(filename) == mtime
+                except OSError:
+                    return False
+            return contents, filename, uptodate
         raise TemplateNotFound(template)
 
 
@@ -191,7 +197,10 @@
             filename = self.provider.get_resource_filename(self.manager, p)
             mtime = path.getmtime(filename)
             def uptodate():
-                return path.getmtime(filename) == mtime
+                try:
+                    return path.getmtime(filename) == mtime
+                except OSError:
+                    return False
 
         source = self.provider.get_resource_string(self.manager, p)
         return source.decode(self.encoding), filename, uptodate
diff --git a/jinja2/utils.py b/jinja2/utils.py
index 338db4a..249e363 100644
--- a/jinja2/utils.py
+++ b/jinja2/utils.py
@@ -685,6 +685,20 @@
         return rv
 
 
+class Joiner(object):
+    """A joining helper for templates."""
+
+    def __init__(self, sep=u', '):
+        self.sep = sep
+        self.used = False
+
+    def __call__(self):
+        if not self.used:
+            self.used = True
+            return u''
+        return self.sep
+
+
 # we have to import it down here as the speedups module imports the
 # markup type which is define above.
 try: