         }
     }
     
+    var _parallelPosition: CGFloat {
+        get {
+            switch self.orientation {
+            case .horizontal:
+                return super.frame.origin.x
+            case .vertical:
+                return super.frame.origin.y
+            }
+        }
+        set(newParallelPosition) {
+            switch self.orientation {
+            case .horizontal:
+                return super.frame.origin.x = newParallelPosition
+            case .vertical:
+                return super.frame.origin.y = newParallelPosition
+            }
+        }
+    }
+    
+    var _orthogonalPosition: CGFloat {
+        get {
+            switch self.orientation {
+            case .horizontal:
+                return super.frame.origin.y
+            case .vertical:
+                return super.frame.origin.x
+            }
+        }
+        set(newOrthogonalPosition) {
+            switch self.orientation {
+            case .horizontal:
+                return super.frame.origin.y = newOrthogonalPosition
+            case .vertical:
+                return super.frame.origin.x = newOrthogonalPosition
+            }
+        }
+    }
+    
     var _length: CGFloat {
         get {
             switch self.orientation {
             case .horizontal:
-                return self.frame.width
-            case .vertical:
-                return self.frame.height
+                return super.frame.width
+            case .vertical:
+                return super.frame.height
             }
         }
         set(newLength) {
             switch self.orientation {
             case .horizontal:
-                self.frame.size.width = newLength
-            case .vertical:
-                self.frame.size.height = newLength
+                super.frame.size.width = newLength
+            case .vertical:
+                super.frame.size.height = newLength
             }
         }
     }

        get {
            switch self.orientation {
            case .horizontal:
                return self.frame.height
            case .vertical:
                return self.frame.width
            }
        }
        set(newLineWidth) {
            switch self.orientation {
            case .horizontal:
                self.frame.size.height = newLineWidth
            case .vertical:
                self.frame.size.width = newLineWidth
            }
        }
    }
}


// MARK: Override Implementations
private extension LineLayer {
    var _frame: CGRect {
        get {
            return super.frame
        }
        set(newFrame) {
            // Fixing the lineWidth
            var fixedFrame: CGRect = newFrame
            switch self.orientation {
            case .horizontal:
                fixedFrame.size.height = self.lineWidth
            case .vertical:
                fixedFrame.size.width = self.lineWidth
            }
            super.frame = fixedFrame
        }
    }
}

        set(newLineWidth) {
            self._lineWidth = newLineWidth
        }
    }
}


// MARK: Class Declaration
public class LineLayer: CALayer {
    // Required Init
    required public init?(coder aDecoder: NSCoder) {
        fatalError("LineLayer does not support NSCoding")
    }
    
    // Init
    public init(configuration: LineLayerConfiguration) {
        super.init()
        // Intentionally using self.__orientation here, so the
        // length and the lineWidth are not unnecessarily swapped.
        // This is also the reason for setting the orientation first.
        self.__orientation = configuration.orientation
        self.length = configuration.length
        self.lineWidth = configuration.lineWidth
        self.parallelPosition = configuration.parallelPosition
        self.orthogonalPosition = configuration.orthogonalPosition
    }
    
    // Private Variables
    fileprivate var __orientation: LineLayer.Orientation = .horizontal
}


// MARK: Unavailability Overrides
public extension LineLayer {
    @available(*, unavailable)
    public final override var frame: CGRect {
        get { return .null }
        set {}
    }
    
    @available(*, unavailable)
    public final override var bounds: CGRect {
        get { return .null }
        set {}
    }
    
    @available(*, unavailable)
    public convenience init(frame: CGRect) {
        fatalError()
    }
    
    @available(*, unavailable)
    public convenience init(size: CGSize) {
        fatalError()
    }
}


// MARK: - // Private
// MARK: Computed Properties
private extension LineLayer {
    var _orientation: LineLayer.Orientation {
