--- /dev/null
+#include "AMateria.h"
+#include "ICharacter.h"
+#include <string>
+
+AMateria::AMateria()
+{
+}
+
+AMateria::AMateria(const AMateria &other)
+ : m_type(other.m_type)
+{
+}
+
+AMateria::~AMateria()
+{
+}
+
+AMateria &AMateria::operator=(const AMateria &other)
+{
+}
+
+AMateria::AMateria(const std::string &type)
+ : m_type(type)
+{
+}
+
+const std::string &getType() const
+{
+ return (m_type);
+}
+
+void use(ICharacter &target);
+{
+ std::cout << "* AMATERIA AFFECTS " << target.getName() << " *\n";
+}
--- /dev/null
+#ifndef AMATERIA_H
+# define AMATERIA_H
+
+# include "ICharacter.h"
+# include <string>
+
+class AMateria
+{
+ private:
+ AMateria();
+ AMateria &operator=(const AMateria &other);
+
+ const std::string m_type;
+
+ public:
+ AMateria(const AMateria &other);
+ AMateria(const std::string &type);
+ virtual ~AMateria();
+
+ const std::string &getType() const;
+
+ virtual AMateria *clone() const = 0;
+ virtual void use(ICharacter &target);
+};
+
+#endif // AMATERIA_H
--- /dev/null
+#include "Cure.h"
+#include <iostream>
+
+Cure::Cure()
+ : AMateria("cure")
+{
+}
+
+Cure::Cure(const Cure &other)
+ : AMateria(other)
+{
+}
+
+Cure::~Cure()
+{
+}
+
+Cure &Cure::operator=(const Cure &other)
+{
+}
+
+AMateria *clone() const
+{
+ return (new Ice(*this));
+}
+
+void use(ICharacter& target)
+{
+ std::cout << "* heals " << target.getName << "'s wounds *\n";
+}
--- /dev/null
+#ifndef CURE_H
+# define CURE_H
+
+class Cure : public AMateria
+{
+ private:
+ Cure &operator=(const Cure &other);
+
+ public:
+ Cure();
+ Cure(const Cure &other);
+ ~Cure();
+};
+
+#endif // CURE_H
--- /dev/null
+#include "Ice.h"
+#include <iostream>
+
+Ice::Ice()
+ : AMateria("ice")
+{
+}
+
+Ice::Ice(const Ice &other)
+ : AMateria(other);
+{
+}
+
+Ice::~Ice()
+{
+}
+
+Ice &Ice::operator=(const Ice &other)
+{
+}
+
+AMateria *clone() const
+{
+ return (new Ice(*this));
+}
+
+void use(ICharacter& target)
+{
+ std::cout << "* shoots an ice bolt at " << target.getName << " *\n";
+}
--- /dev/null
+#ifndef ICE_H
+# define ICE_H
+
+class Ice : public AMateria
+{
+ private:
+ Ice &operator=(const Ice &other);
+
+ public:
+ Ice();
+ Ice(const Ice &other);
+ ~Ice();
+};
+
+#endif // ICE_H