     
     public var absolutised: Bool = false
     
-    public mutating func absolutise(absoluteName: String) {
+    init(name: IdentifierExpression, receiverType: TypeIdentifierExpression, parameters: [PairExpression], returnType: TypeIdentifierExpression?, genericConstraints: ConstraintList?) {
+        self.name = name
+        self.receiverType = receiverType
+        self.parameters = parameters
+        self.returnType = returnType
+        self.genericConstraints = genericConstraints
+    }
+    
+    public func absolutise(absoluteName: String) {
         self.name.value = absoluteName
         self.absolutised = true
     }

        pairs.enumerated().forEach { order[$0.element.name.value] = $0.offset }
        
        let defaultConstructorName = IdentifierExpression(value: "__init__", grouped: false)
        let defaultConstructorSignature = StaticSignatureExpression(name: defaultConstructorName, receiverType: name, parameters: pairs, returnType: name, genericConstraints: nil, absolutised: false)
        
        // TODO - Optional parameters, default parameters
        
        return TypeDefExpression(name: name, properties: pairs, propertyOrder: order, constructorSignatures: [defaultConstructorSignature], absolutised: false)
    }
    
    /// A pair consists of an identifier followed by a type identifier, e.g. i Int

    var genericConstraints: ConstraintList? { get }
}

public class StaticSignatureExpression : SignatureExpression, AbsoluteNameAware {
    public typealias Receiver = TypeIdentifierExpression
    
    public let hashValue: Int = nextHashValue()
