module hunt.cache.Nullable;

struct Nullable(T)
{
    auto opDispatch(string s, ARGS ...) (ARGS i) if(hasMember!(T,s))
    {
        mixin( "return _t."~s~"(i);");
    }

    bool isNull() 
    {
        return _isNull;
    }

    @property T origin()
    {
        return _t;
    }

    void bind(T t)
    {
        _isNull = false;
        _t = t;
    }

    T opCast(T) ()
    {
        return _t;
    }

    T _t;
    alias _t this;

    private bool _isNull = true;
}