/***************************************************************************** * Copyright [2013] [Jules White] * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * * You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, software * * distributed under the License is distributed on an "AS IS" BASIS, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and * * limitations under the License. * ****************************************************************************/ package org.magnum.soda; import java.util.Collection; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; public class Mixins { private final Cache<Class<?>, Collection<Class<?>>> cache_ = CacheBuilder.newBuilder() .maximumSize(100) .build(); private final Multimap<Class<?>, Class<?>> mixed_ = HashMultimap.create(); public void mixin(Class a, Class b){ mixed_.put(a,b); } public Collection<Class<?>> getMixins(Class a){ Collection<Class<?>> mixes = cache_.getIfPresent(a); if(mixes == null){ mixes = mixed_.get(a); if(Object.class.equals(a.getClass())){ mixes.addAll(getMixins(a.getClass().getSuperclass())); } } if(mixes.size() > 0){ cache_.put(a, mixes); } return mixes; } }