All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.whaka.util.reflection.properties.FunctionalClassProperty Maven / Gradle / Ivy

package org.whaka.util.reflection.properties;

import java.util.function.BiConsumer;
import java.util.function.Function;

import org.whaka.util.reflection.Visibility;

public class FunctionalClassProperty implements ClassProperty {

	private final ClassPropertyKey key;
	private final Class type;
	private final Visibility visibility;
	private final boolean _static;
	private final Function getter;
	private final BiConsumer setter;

	public FunctionalClassProperty(ClassPropertyKey key, Class type, Visibility visibility,
			Function getter) {
		this(key, type, visibility, getter, null);
	}
	
	public FunctionalClassProperty(ClassPropertyKey key, Class type, Visibility visibility,
			Function getter, BiConsumer setter) {
		this(key, type, visibility, getter, setter, false);
	}
	
	public FunctionalClassProperty(ClassPropertyKey key, Class type, Visibility visibility,
			Function getter, BiConsumer setter, boolean _static) {
		
		this.key = key;
		this.type = type;
		this.visibility = visibility;
		this._static = _static;
		this.getter = getter;
		this.setter = setter;
	}
	
	@Override
	public ClassPropertyKey getKey() {
		return key;
	}

	@Override
	public Class getType() {
		return type;
	}

	@Override
	public Visibility getVisibility() {
		return visibility;
	}

	@Override
	public boolean isStatic() {
		return _static;
	}

	public Function getGetter() {
		return getter;
	}
	
	public BiConsumer getSetter() {
		return setter;
	}
	
	@Override
	public Type getValue(TargetType target) throws Exception {
		return getter.apply(target);
	}
	
	/**
	 * throws UnsupportedOperationException if {@link #isMutable()} returns false.
	 */
	@Override
	public void setValue(TargetType target, Type value) throws Exception {
		if (!isMutable())
			throw new UnsupportedOperationException("No setter function specified!");
		setter.accept(target, value);
	}
	
	/**
	 * Returns false is no setter function was specified for this property.
	 */
	@Override
	public boolean isMutable() {
		return setter != null;
	}
	
	public static  FunctionalClassProperty newPublic(ClassPropertyKey key,
			Class type, Function getter) {
		return new FunctionalClassProperty<>(key, type, Visibility.PUBLIC, getter);
	}
	
	public static  FunctionalClassProperty newPublic(ClassPropertyKey key,
			Class type, Function getter, BiConsumer setter) {
		return new FunctionalClassProperty<>(key, type, Visibility.PUBLIC, getter, setter);
	}
	
	public static  FunctionalClassProperty newPublic(ClassPropertyKey key,
			Class type, Function getter, BiConsumer setter, boolean _static) {
		return new FunctionalClassProperty<>(key, type, Visibility.PUBLIC, getter, setter, _static);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy