#include <iostream>
#include <functional>
using namespace std;

template <typename T>
class Property{
	private:
	
	T val;
	
	std::function<void(T& v,const T& newV)> setFN = nullptr;
	
	public:
	
	void setter(decltype(setFN) newSetter){
		setFN = newSetter;
	}
		
	void set(const T& newVal){
		if(!setFN)
			val = newVal;
		else
			setFN(val,newVal);
	}
	
	T get(){
		return val;
	}
};

int main() {
	
	Property<int> x;
	
	x.set(5);
	std::cout << x.get() << std::endl;
	
	x.setter([](int& v, const int& newV){std::cout << "Setter called\n"; v=newV;});
	
	x.set(2);
	std::cout << x.get() << std::endl;
	// your code goes here
	return 0;
}