public T get()
    {
        try
        {
            if (result != null)
                return result;
            
            if (future.isCancelled())
                return getDefaultResult();
            
            if (sla.isExceeded())            
                timeout();      
            else            
                result = sla.get(future);
            
            return (result != null) ? 
                result : getDefaultResult();
        }
        catch (TimeoutException anExc)
        {
            timeout();
            return result;
        }
        catch (InterruptedException anExc)
        {
            Thread.interrupted(); // clear interrupt
            return getDefaultResult();
        }
        catch (CancellationException anExc)
        {            
            return getDefaultResult();
        }
        catch (ExecutionException anExc)
        {            
            whenExecutionException(anExc.getCause());
            return getDefaultResult();
        }        
    }