code: @SuppressWarnings("unchecked")
      static synchronized <S extends Storable> GenericStorableCodec<S> getInstance
          (GenericStorableCodecFactory factory,
           GenericEncodingStrategy<S> encodingStrategy, boolean isMaster,
           Layout layout, RawSupport support)
          throws SupportException
      {
          Object layoutKey = layout == null ? null : new LayoutKey(layout);
          Object key = KeyFactory.createKey(new Object[] {encodingStrategy, isMaster, layoutKey});
  
          Class<? extends S> storableImpl = (Class<? extends S>) cCache.get(key);
          if (storableImpl == null) {
              storableImpl = generateStorable(encodingStrategy, isMaster, layout);
              cCache.put(key, storableImpl);
          }
  
          return new GenericStorableCodec<S>
              (key,
               factory,
               encodingStrategy.getType(),
               storableImpl,
               encodingStrategy,
               layout,
               support);
      }
docs: Returns an instance of the codec. The Storable type itself may be an
  interface or a class. If it is a class, then it must not be final, and
  it must have a public, no-arg constructor.
  
  @param isMaster when true, version properties and sequences are managed
  @param layout when non-null, encode a storable layout generation
  value in one or four bytes. Generation 0..127 is encoded in one byte, and
  128..max is encoded in four bytes, with the most significant bit set.
  @param support binds generated storable with a storage layer
  @throws SupportException if Storable is not supported
  @throws amazon.carbonado.MalformedTypeException if Storable type is not well-formed
  @throws IllegalArgumentException if type is null