         }
     }
     
-    func getValueFrom<T : Any>(object:A, defaultvalueblock : () -> T) -> T
+    public func getValueFrom<T : Any>(object:A, defaultvalueblock : () -> T) -> T
     {
         let value: T? = getValueFrom(object)
         if let v = value {

            objc_setAssociatedObject(object, key, nil, policy)
        }
    }
    func setStrongValueOn<T : AnyObject>(object:A, value : T?)
    {
        let policy = objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC
        objc_setAssociatedObject(object, key, value, policy)
    }
    
    // Any values cannot be captured weakly.  so we don't supply a Weak setter for Any
    func setWeakValueOn<T : AnyObject>(object:A, value : T?)
    {
        let policy = objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC
        if let v = value {

    private var keyValue = UnSafeMutableContainer<Int8>(0)
    private var key : UnsafeMutablePointer<Int8>  { get { return keyValue.unsafe_pointer } }
    
    
    public init() {
        
    }
    
    // Two STRONG implementations - Any and AnyObject.
    // AnyObject will match NSObject compatible values
    // Any will match any class, using the Strong<T> to wrap the object in a class so it can be set correctly
    // This is the "default set".
    public func setStrongValueOn<T : Any>(object:A, value : T?)
    {
        // so we can't 'test' for AnyObject but we can seem to test for NSObject
        let policy = objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC
