             case Legacy(OSType)
         #endif
         
-        private init?(kind: TagKind, value: String) {
-            #if os(OSX)
-                switch kind {
-                case .FilenameExtension: self = .FilenameExtension(value)
-                case .MIME: self = .MIME(value)
-                case .Pasteboard: self = .Pasteboard(value)
-                case .Legacy:
-                    if let osType = OSType(string: value) {
-                        self = .Legacy(osType)
-                    } else {
-                        return nil
-                    }
-                default: return nil
-                }
-            #else
-                switch kind {
-                case .FilenameExtension: self = .FilenameExtension(value)
-                case .MIME: self = .MIME(value)
-                default: return nil
-                }
-            #endif
-        }
-        
         var kindValue: String {
             #if os(OSX)
                 switch self {

    }
    
    public var preferredPathExtension: String? {
        return preferredTag(.FilenameExtension)
    }
    
    public var preferredMIMEType: String? {
        return preferredTag(.MIME)
    }
    
    public var pathExtensions: [String]? {
        return allTags(.FilenameExtension)
    }
    
    public var MIMETypes: [String]? {
        return allTags(.MIME)
    }
    
    #if os(OSX)
    
        public var preferredPasteboardType: String? {
            return preferredTag(.Pasteboard)
        }
        
        public var preferredLegacyType: OSType? {
            return OSType(string: preferredTag(.Legacy))
        }
        
        public var pasteboardTypes: [String]? {
            return allTags(.Pasteboard)
        }
        
        public var preferredLegacyTypes: [OSType]? {
            return allTags(.Legacy)?.map { OSType(string: $0)! }
        }
    
    #endif


#endif

// MARK: Tag Classes (Private)

private extension UTI {
    
    func preferredTag(kind: String) -> String? {
        return UTTypeCopyPreferredTagWithClass(identifier, kind)?.takeRetainedValue()
    }
    
    func allTags(kind: String) -> [String]? {
        return UTTypeCopyAllTagsWithClass(identifier, kind)?.takeRetainedValue() as? [String]
    }
    
}
