         }
     }
     
-    private func valueFrom(_ info:[String:Any], key:String, defaultValue:CGFloat) -> CGFloat {
+    private func value(from info:[String:Any], key:String, defaultValue:CGFloat) -> CGFloat {
         if let value = info[key] as? CGFloat {
             return value
         }
         return defaultValue
     }
 
-    private func booleanValueFrom(_ info:[String:Any], key:String, defaultValue:Bool) -> Bool {
+    private func booleanValue(from info:[String:Any], key:String, defaultValue:Bool) -> Bool {
         if let value = info[key] as? Bool {
             return value
         }

                ani.fillMode = kCAFillModeBoth
                loopLayer.add(ani, forKey: "opacity")
            case "spin":
                let fClockwise = booleanValueFrom(animation, key: "clockwise", defaultValue: true)
                let degree = (fClockwise ? 120 : -120) * CGFloat(M_PI / 180.0)
                let ani = CAKeyframeAnimation(keyPath: "transform")
                ani.values = [NSValue(caTransform3D:loopLayer.transform),

                start = 1e-10
                duration = 1.0
            }
            let repeatCount = Float(value(from: animation, key: "count", defaultValue: 1))
        
            switch(style) {
            case "vibrate":
                let delta = value(from: animation, key: "delta", defaultValue: 10.0)
                let ani = CAKeyframeAnimation(keyPath: "transform")
                ani.values = [NSValue(caTransform3D:loopLayer.transform),
                              NSValue(caTransform3D:CATransform3DConcat(CATransform3DMakeTranslation(delta, 0.0, 0.0), loopLayer.transform)),
