     Not all data sources have to implement hierarchies: they can simply ignore
     this parameter.
     
-    The return value of this method can be nil: the library user would then
-    eventually get an NSError of domain GRMustacheErrorDomain and code
-    GRMustacheErrorCodeTemplateNotFound.
+    *Well-behaved* data sources that support hierarchies should support
+    "absolute paths to partials". For example, the built-in directory-based data
+    source lets users write both `{{> relative/path/to/partial}}` and
+    `{{> /absolute/path/tp/partial}}`tags.
+    
+    ### Unique IDs
+    
+    Each template must be identified by a single template ID. For example, a
+    file-based data source which uses path IDs must normalize paths. Not
+    following this rule yields undefined behavior.
     
     :param: name           The name of the template or template partial.
     :param: baseTemplateID The template ID of the enclosing template, or nil.


import Foundation

public typealias TemplateID = String

/**

template and partial names.
*/
public protocol TemplateRepositoryDataSource {
    
    /**
    Returns a template ID, that is to say a string that uniquely identifies a
    template or a template partial.
    
    The meaning of this String is opaque: your implementation of a
    `TemplateRepositoryDataSource` would define, for itself, how strings would
    identity a template or a partial. For example, a file-based data source may
    use paths to the templates.
    
    The return value of this method can be nil: the library user would then
    eventually get an NSError of domain GRMustacheErrorDomain and code
    GRMustacheErrorCodeTemplateNotFound.
    
    ### Template hierarchies
    
    Whenever relevant, template and partial hierarchies are supported via the
    baseTemplateID parameter: it contains the template ID of the enclosing
