public Object getAdapter0(Object source, String property) {
    if ((source == null) || (property == null)) {
      throw new IllegalArgumentException();
    }

    loadProvidersIfNecessary();
    property = property.intern();

    BeanAdapterProvider provider = getProvider(source, property);

    if (provider != null) {
      List<VendedAdapter> adapters = vendedAdapters.get(source);

      if (adapters != null) {
        for (int i = adapters.size() - 1; i >= 0; i--) {
          VendedAdapter vendedAdapter = adapters.get(i);
          Object adapter = vendedAdapter.getAdapter();

          if (adapter == null) {
            vendedAdapters.remove(i);
          } else if ((vendedAdapter.getProvider() == provider)
              && (vendedAdapter.getProperty() == property)) {
            return adapter;
          }
        }
      } else {
        adapters = new ArrayList<VendedAdapter>(1);
        vendedAdapters.put(source, adapters);
      }

      Object adapter = provider.createAdapter(source, property);
      adapters.add(new VendedAdapter(property, provider, adapter));

      return adapter;
    }

    return null;
  }