 }
 
 public struct AndProperty: PropertyType {
-    private let left: PropertyOf<Bool>
-    private let right: PropertyOf<Bool>
+    private let left: AnyProperty<Bool>
+    private let right: AnyProperty<Bool>
     
     public var value: Bool {
         return left.value && right.value

    }
    
    public init<L: PropertyType, R: PropertyType where L.Value == Bool, R.Value == Bool>(lhs: L, rhs: R) {
        left = PropertyOf(lhs)
        right = PropertyOf(rhs)
    }
}

public struct OrProperty: PropertyType {
    private let left: PropertyOf<Bool>
    private let right: PropertyOf<Bool>
    
    public var value: Bool {
        return left.value || right.value

    }

    public init<L: PropertyType, R: PropertyType where L.Value == Bool, R.Value == Bool>(lhs: L, rhs: R) {
        left = AnyProperty(lhs)
        right = AnyProperty(rhs)
    }
}

public struct NotProperty: PropertyType {
    private let source: AnyProperty<Bool>
    
    public var value: Bool {
        return !source.value
