      - Parameter line: Current text line
      - Parameter glyph: Current glyph
      */
-    func enumerateGlyphs(_ callback:(_ line: TextPathLine, _ glyph: TextPathGlyph) -> ()) {
+    public func enumerateGlyphs(_ callback:(_ line: TextPathLine, _ glyph: TextPathGlyph) -> ()) {
         for glyph in glyphs {
             callback(self, glyph)
         }

/**
 Text path represents a CGPath representation of text frame, glyphs and typographic properties
 */
class TextPath {
    
    /// attributed text used to generate text path
    fileprivate(set) var attributedString: NSAttributedString
    
    /// text path composed for input text
    fileprivate(set) var composedPath: CGPath?
    
    /// text frames
    fileprivate(set) var frames = [TextPathFrame]()
    
    init(text: NSAttributedString, path: CGPath? = nil) {
        self.attributedString = text
        self.composedPath = path
    }
}

extension NSAttributedString {
    
    /**
        Creates a text path and a collection of text lines and 

                                unicodeIndex = unicodeScalars.index(after: unicodeIndex)
                                
                                if(!ignoredCharsSet.contains(unicodeScalars[glyphUnicodeIndex])) {
                                    effectiveAscent = max(effectiveAscent, abs(rt_ascent))
                                    effectiveDescent = max(effectiveDescent, abs(rt_descent))
                                    
                                    let glyph = glyphPtr.pointee
