#include <functional>
#include <iostream>

class Tracker
{
public:
    Tracker() : _methodCalled(false) {}

    void MethodToCall()
    {
        std::cout << "Method called\n";
    	_methodCalled = true;
    }
    
    bool GetMethodCalled() const
    {
        return _methodCalled;
    }

private:
    bool _methodCalled;
};
 
int main()
{
    Tracker trackerToCopy;
    auto boundToCopy = std::bind(&Tracker::MethodToCall, trackerToCopy);
    
    std::cout << "Bound to copy of tracker\n\t";
    boundToCopy();
    std::cout << "\t_methodCalled value: " << (trackerToCopy.GetMethodCalled() ? "true" : "false") << std::endl;
    
    Tracker trackerLocalInstance;
    auto boundToLocalInstance = std::bind(&Tracker::MethodToCall, &trackerLocalInstance);

    std::cout << "Bound to local instance of tracker\n\t";
    boundToLocalInstance();
    std::cout << "\t_methodCalled value: " << (trackerLocalInstance.GetMethodCalled() ? "true" : "false") << std::endl;

    Tracker trackerReference;
    auto boundToReference = std::bind(&Tracker::MethodToCall, std::ref(trackerReference));

    std::cout << "Bound to refrence to tracker\n\t";
    boundToReference();
    std::cout << "\t_methodCalled value: " << (trackerReference.GetMethodCalled() ? "true" : "false") << std::endl;
    
    return 0;
}