/* * Copyright (c) 2011-2014 Jeppetto and Jonathan Thompson * * 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.iternine.jeppetto.enhance; public class ChainingEnhancer<T> extends Enhancer<T> { //------------------------------------------------------------- // Variables - Private //------------------------------------------------------------- private Enhancer<T> first; private Enhancer<T> second; //------------------------------------------------------------- // Constructor //------------------------------------------------------------- public ChainingEnhancer(Class<T> rawClass, Enhancer<T> first, Enhancer<T> second) { super(rawClass); this.first = first; this.second = second; } //------------------------------------------------------------- // Implementation - Enhancer //------------------------------------------------------------- @Override protected Class<? extends T> enhanceClass(Class<T> baseClass) { //noinspection unchecked return second.enhanceClass((Class<T>) first.enhanceClass(baseClass)); } @Override public boolean needsEnhancement(Object object) { return first.needsEnhancement(object) || second.needsEnhancement(object); } //------------------------------------------------------------- // Overrides - Enhancer //------------------------------------------------------------- @Override public Class<? extends T> getEnhancedClass() { return second.getEnhancedClass(); } @Override public T enhance(T t) { return second.enhance(first.enhance(t)); } @Override public T newInstance() { return second.newInstance(); } }