public virtual bool SetAttributes(AttributeList attrList)
        {
            bool ret          = true; // Minden attribútum sikeresen hozzáadódott.
            var  attrNameList = attrList.GetAttributeList().Select(attr => attr.Name);

            // ha az attribute list nem tartalmazza az összes required attribute-ot, akkor default értéket kell használnunk.
            var intersection = requiredAttributes.Intersect(attrNameList);

            if (intersection.Count() != requiredAttributes.Count())
            {
                ret = false;
            }

            foreach (var attr in attrList)
            {
                // Kötelező attribútumok hiánya mát kezelve van, ha olyan jön akkor nem érdekes az if blokk
                // Ha az adott attribútum nem része az opcionális attribútumok halmazának, az baj.
                if (!requiredAttributes.Contains(attr.Name) && !allowedAttributes.Contains(attr.Name))
                {
                    ret = false;
                }

                switch (attr.Name)
                {
                case "position":
                    // new vec3, hogy a referenciákat megszüntessük a visitorral
                    position = new vec3(attr.Value);
                    break;

                case "rotation-angle":
                    rotationAngles.Add(attr.Value);
                    break;

                case "rotation-axis":
                    rotationAxes.Add(new vec3(attr.Value));
                    break;

                case "scale":
                    scale = new vec3(attr.Value);
                    break;

                case "default":
                    // ősosztály valósítja meg
                    break;
                }
            }

            modelMatrixInverse.Translate(position);
            modelMatrixInverse.Scale(scale);
            for (int i = 0; i < rotationAngles.Count; ++i)
            {
                Matrix4 rotation = Matrix4.CreateRotationMatrix(rotationAxes[i], rotationAngles[i]);
                modelMatrixInverse *= rotation;
            }

            // TODO jövőre!!

            /*modelMatrixInverse.Invert();
             * modelMatrixInverse.Transpose();*/


            // kiírjuk a fejlesztőnek segítségül, hogy milyen attribútummokat használhat az objektumnál.
            // *-al jelöljük a kötelezőket.
            if (ret == false)
            {
                string wMsg = "";

                foreach (var attrName in requiredAttributes)
                {
                    wMsg += "*" + attrName + ", ";
                }

                allowedAttributes.ExceptWith(requiredAttributes);   // allowed attributes most már csak a nem kötelező, de használható attribútumokat mutatja.
                foreach (var attrName in allowedAttributes)
                {
                    wMsg += attrName + ", ";
                }
                wMsg       = wMsg.Remove(wMsg.Length - 2);
                WarningMsg = wMsg;
            }

            return(ret);
        }