code: public <V> T get(Functor<T, V> functor, V argument) throws Exception {
          T result = _value;
          if (isMissing(result)) synchronized(this) {
              result = _value;
              if (isMissing(result)) {
                  _value = result = functor.invoke(argument);
              }
          }
          return result;
      }
docs: Retrieves the singleton object, creating it by calling a provider if it is not created yet. This method uses
  double-checked locking to ensure that only one instance will ever be created, while keeping retrieval cost at
  minimum.
  
  @see <a href="http://en.wikipedia.org/wiki/Double-checked_locking">Double-checked locking</a>
  
  @param <V> the argument type to the functor
  @param functor a {@link org.xillium.base.Functor Functor} that can be called to create a new value with 1 argument
  @param argument the argument to pass to the functor
  @return the singleton object
  @throws Exception if the functor fails to create a new value