Inheritance and Mootools Mixins

I was playing with Mootools' Class implementation today. It has a few nice features like mixins, easy inheritance and sane parent method calling. I did run into issues combining mixins (through the Implements keyword) with parent method calling. The following code fails with the message: The method "setOptions" has no parent.

var Car = new Class({
    Extends: Vehicle,
    Implements: [Options],

    options: {
        wheels: 2,
    },

    setOptions: function(options) {
        if (options.wheels < 3) {
            throw new Error("That's not a car.");
        } else {
            this.parent(options);
        }
    }
});

Apparently mixin methods like setOptions don't act like inherited functions in Mootools' class implementation. The obvious fix is to make the class inherit from the mixin directly.

var Car = new Class({
    Extends: Options,

    // Code omitted
}

This works, but we've lost the ability to create a sane object hierarchy. Thankfully the Options variable I added to the Implements array is just a reference to the class used to implement the mixin. So it is possible to call the parent method manually, just like I would without Mootool's magic this.parent method.

var Car = new Class({

    // Code omitted

    setOptions: function(options) {
        if (options.wheels == 2) {
            throw new Error("That's not a car.");
        } else {
            Options.prototype.setOptions.call(this, options);
        }
    }
}

This works exactly like I hoped. The same approach would obviously work for other mixins like _Events _ and Chain.

As a side note, it's worth mentioning that Options.prototype.setOptions is actually pointing to a wrapper method which does a bit of Mootools-specific magic and validation; like ensuring the function is not protected. Fortunately the wrapper is written in a sane enough way that calling it from another object like this works OK.