int main()
{
  CallbackContainer cb;
  DriverClass driver;

  ArFunctorC<CallbackContainer> functor1(cb, &CallbackContainer::callback1);
  ArFunctor1C<CallbackContainer, int> functor2(cb, &CallbackContainer::callback2);
  ArRetFunctor1C<bool, CallbackContainer, const char *>
    functor3(cb, &CallbackContainer::callback3);

  driver.setCallback1(&functor1);
  driver.setCallback2(&functor2);
  driver.setCallback3(&functor3);

  driver.invokeFunctors();

  /* You can make functors that target global functions too. */
  ArGlobalFunctor globalFunctor(&globalCallback);
  printf("Invoking globalFunctor... ");
  globalFunctor.invoke();

  /* You can also include the values of arguments in an ArFunctor object, if you
   * want to use the same value in every invocation of the functor.
   */
  ArFunctor1C<CallbackContainer, int> functor4(cb, &CallbackContainer::callback2, 42);
  printf("Invoking functor with constant argument... ");
  functor4.invoke();

  /* Functors can be downcast to parent interface classes, as long as their invocation
   * does not require arguments.
   */
  ArFunctor* baseFunctor = &functor4;
  printf("Invoking downcast functor... ");
  baseFunctor->invoke();


  return(0);
}
int	main()
{
  /* etape 2 */

  std::cout << "TEST operator =" << std::endl;

  Function<int (const char*)> functor;
  functor = &myTest;
  functor("test operator = : SUCCESS");

  std::cout << "TEST constructor with assignation" << std::endl;
  Function<int (const char*)> functor2 = &myTest;
  functor("test constructor with assignation : SUCCESS");

  std::cout << "TEST callable object" << std::endl;
  Callable1	call1;
  Function<void (char)> functor3 = &call1;
  functor3('a');

  std::cout << "TEST boost::bind with function" << std::endl;
  Function<int (char)> functor4 = (boost::function<int (char)>)boost::bind(&boost_test, 'c');
  functor4('a');
  return 0;
}