--- /dev/null
+#include "Harl.h"
+#include <sys/types.h>
+#include <string>
+#include <map>
+#include <iostream>
+
+Harl::Harl(int filter)
+{
+ m_filter = filter;
+ m_levels[0] = "DEBUG";
+ m_speech[0] = &Harl::debug;
+ m_levels[1] = "INFO";
+ m_speech[1] = &Harl::info;
+ m_levels[2] = "WARNING";
+ m_speech[2] = &Harl::warning;
+ m_levels[3] = "ERROR";
+ m_speech[3] = &Harl::error;
+}
+
+Harl::Harl(const Harl &harl)
+{
+ *this = harl;
+}
+
+Harl::~Harl()
+{
+}
+
+Harl &Harl::operator=(const Harl &harl)
+{
+ m_levels[0] = harl.m_levels[0];
+ m_speech[0] = harl.m_speech[0];
+ m_levels[1] = harl.m_levels[1];
+ m_speech[1] = harl.m_speech[1];
+ m_levels[2] = harl.m_levels[2];
+ m_speech[2] = harl.m_speech[2];
+ m_levels[3] = harl.m_levels[3];
+ m_speech[3] = harl.m_speech[3];
+ m_filter = harl.m_filter;
+ return (*this);
+}
+
+ssize_t Harl::get_level_num(std::string level)
+{
+ for (ssize_t i(0); i < 4; ++i)
+ if (m_levels[i] == level)
+ return (i);
+ return (-1);
+}
+
+void Harl::complain(std::string level)
+{
+ ssize_t i;
+
+ i = get_level_num(level);
+ if (i < 0 || i >= m_filter)
+ {
+ if (i >= 0)
+ std::cout << '[' << level << "]\n";
+ switch (i)
+ {
+ case 0:
+ debug();
+ break ;
+ case 1:
+ info();
+ break ;
+ case 2:
+ warning();
+ break ;
+ case 3:
+ error();
+ break ;
+ default:
+ std::cout << "Harl does not know this level.\n\n";
+ break ;
+ }
+ }
+}
+
+void Harl::debug(void)
+{
+ std::cout << "I love having extra bacon for my "
+ "7XL-double-cheese-triple-pickle-special-ketchup burger. I really do!\n\n";
+}
+
+void Harl::info(void)
+{
+ std::cout << "I cannot believe adding extra bacon costs more money. "
+ "You didn’t put enough bacon in my burger! "
+ "If you did, I wouldn’t be asking for more!\n\n";
+}
+
+void Harl::warning(void)
+{
+ std::cout << "I think I deserve to have some extra bacon for free. "
+ "I’ve been coming for ears whereas you started working here since last month.\n\n";
+}
+
+void Harl::error(void)
+{
+ std::cout << "This is unacceptable! I want to speak to the manager now.\n\n";
+}
--- /dev/null
+#ifndef HARL_H
+# define HARL_H
+
+# include <sys/types.h>
+# include <string>
+
+class Harl
+{
+ private:
+ void debug(void);
+ void info(void);
+ void warning(void);
+ void error(void);
+
+ void (Harl::*m_speech[4])(void);
+ std::string m_levels[4];
+ int m_filter;
+
+ public:
+ Harl(int filter = 0);
+ Harl(const Harl &harl);
+ ~Harl();
+
+ Harl &operator=(const Harl &harl);
+ void complain(std::string level);
+ ssize_t get_level_num(std::string level);
+};
+
+#endif // HARL_H
--- /dev/null
+#include "Harl.h"
+#include <iostream>
+
+void test_harl(ssize_t filter)
+{
+ Harl harl(filter);
+
+ harl.complain("INFO");
+ harl.complain("DEBUG");
+ harl.complain("WARNING");
+ harl.complain("ERROR");
+ harl.complain("DEBUG");
+ harl.complain("INFO");
+ harl.complain("ERROR");
+}
+
+int main(int argc, char **argv)
+{
+ Harl harl;
+
+ if (argc != 2 || harl.get_level_num(argv[1]) == -1)
+ {
+ std::cout << "[ Probably complaining about insignificant problems ]\n";
+ return (1);
+ }
+ test_harl(harl.get_level_num(argv[1]));
+ return (0);
+}