package sk.stuba.fiit.perconik.utilities.reflect.accessor; import com.google.common.reflect.TypeToken; public final class DelayedLookup<T> extends AbstractLookup<T> { DelayedLookup(final Builder<T> builder) { super(builder); } public static final class Builder<T> extends AbstractBuilder<T> { public Builder() {} public Builder<T> classConstant(final Class<?> implementation, final Class<? extends T> type, final String name) { return classConstant(implementation, TypeToken.of(type), name); } public Builder<T> classConstant(final Class<?> implementation, final TypeToken<? extends T> type, final String name) { try { this.add(StaticAccessor.ofClassConstant(implementation, type, name)); } catch (Exception e) { this.handle(e); } return this; } public Builder<T> classField(final Class<?> implementation, final Class<? extends T> type, final String name) { return classField(implementation, TypeToken.of(type), name); } public Builder<T> classField(final Class<?> implementation, final TypeToken<? extends T> type, final String name) { try { this.add(StaticAccessor.ofClassField(implementation, type, name)); } catch (Exception e) { this.handle(e); } return this; } public Builder<T> classConstructor(final Class<? extends T> type, final Object ... arguments) { return this.classConstructor(TypeToken.of(type), arguments); } public Builder<T> classConstructor(final TypeToken<? extends T> type, final Object ... arguments) { try { this.add(StaticAccessor.ofClassConstructor(type, arguments)); } catch (Exception e) { this.handle(e); } return this; } public Builder<T> classMethod(final Class<?> implementation, final Class<? extends T> type, final String name, final Object ... arguments) { return classMethod(implementation, TypeToken.of(type), name, arguments); } public Builder<T> classMethod(final Class<?> implementation, final TypeToken<? extends T> type, final String name, final Object ... arguments) { try { this.add(StaticAccessor.ofClassMethod(implementation, type, name, arguments)); } catch (Exception e) { this.handle(e); } return this; } public Builder<T> enumConstant(final Class<? extends T> type, final String name) { return this.enumConstant(TypeToken.of(type), name); } public Builder<T> enumConstant(final TypeToken<? extends T> type, final String name) { try { this.add(StaticAccessor.ofEnumConstant(type, name)); } catch (Exception e) { this.handle(e); } return this; } public Builder<T> instanceConstant(final Object instance, final Class<? extends T> type, final String name) { return instanceConstant(instance, TypeToken.of(type), name); } public Builder<T> instanceConstant(final Object instance, final TypeToken<? extends T> type, final String name) { try { this.add(DynamicAccessor.ofInstanceConstant(instance, type, name)); } catch (Exception e) { this.handle(e); } return this; } public Builder<T> instanceField(final Object instance, final Class<? extends T> type, final String name) { return instanceField(instance, TypeToken.of(type), name); } public Builder<T> instanceField(final Object instance, final TypeToken<? extends T> type, final String name) { try { this.add(DynamicAccessor.ofInstanceField(instance, type, name)); } catch (Exception e) { this.handle(e); } return this; } public Builder<T> instanceMethod(final Object instance, final Class<? extends T> type, final String name, final Object ... arguments) { return instanceMethod(instance, TypeToken.of(type), name, arguments); } public Builder<T> instanceMethod(final Object instance, final TypeToken<? extends T> type, final String name, final Object ... arguments) { try { this.add(DynamicAccessor.ofInstanceMethod(instance, type, name, arguments)); } catch (Exception e) { this.handle(e); } return this; } @Override public DelayedLookup<T> build() { return new DelayedLookup<>(this); } } public static <T> Builder<T> builder() { return new Builder<>(); } }