package tc.oc.evil;
public interface DecoratorGenerator {
<T, D extends Decorator<T>> Meta<T, D> implement(Class<T> type, Class<D> decorator);
class Meta<T, D extends Decorator<T>> {
public final Class<T> type;
public final Class<D> decorator;
public final Class<? extends D> implementation;
public Meta(Class<T> type, Class<D> decorator, Class<? extends D> implementation) {
this.type = type;
this.decorator = decorator;
this.implementation = implementation;
}
public D newInstance() throws Exception {
return implementation.newInstance();
}
public D newInstance(Class<?>[] parameterTypes, Object[] arguments) throws Exception {
return implementation.getConstructor(parameterTypes).newInstance(arguments);
}
@Override
public int hashCode() {
return decorator.hashCode();
}
@Override
public boolean equals(Object that) {
return this == that || (that instanceof Meta && decorator.equals(((Meta) that).decorator));
}
}
}