#include <map>
#include <cstdlib>
#include <iostream>

class Foo
{
public:
	void update( )
	{
		std::cout << "Foo::update()" << std::endl;
	}
};

class Bar
{
public:
	void update( )
	{
		std::cout << "Bar::update()" << std::endl;
	}
};

class Container
{
public:
	typedef void (Container::*updateMethod)();
	typedef std::map<std::string , updateMethod> UpdateMethodMap;

	static const UpdateMethodMap	m_updateMethod;
	static UpdateMethodMap			initializeUpdateMethodMap();
	static updateMethod				getUpdateMethod( const std::string attributeName );
	
	void update( const std::string name )
	{
		updateMethod updater = getUpdateMethod( name );
		if( updater )
		{
			(this->*updater)();
		}
	}
	
	void updateFoo()
	{
		std::cout << "Container::updateFoo() -> ";
		m_foo.update();
	}
	
	void updateBar()
	{
		std::cout << "Container::updateBar() -> ";
		m_bar.update();
	}
	
private:	
	Foo	m_foo;
	Bar	m_bar;
};

const Container::UpdateMethodMap Container::m_updateMethod = Container::initializeUpdateMethodMap();

/////////////////////////////////////////////////////////////////////////////

Container::UpdateMethodMap Container::initializeUpdateMethodMap()
{
	Container::UpdateMethodMap updateMethodMap;

	updateMethodMap["foo"] = &Container::updateFoo;
	updateMethodMap["bar"] = &Container::updateBar;
	
	return updateMethodMap;
}

//////////////////////////////////////////////////////////////////////

Container::updateMethod Container::getUpdateMethod( const std::string name )
{
	UpdateMethodMap::const_iterator updateMethodMapItx = m_updateMethod.find( name );

	if( updateMethodMapItx == m_updateMethod.end() )
	{
		return NULL;
	}

	return updateMethodMapItx->second;
}

/////////////////////////////////////////////////////////////////////////////

int main()
{
	Container c;
	c.update( "foo" );
	c.update( "bar" );
	
	return EXIT_SUCCESS;
}

//////////////////////////////////////////////////////////////////////
