Joose the JavaScript implementation of Moose now has Roles.
A direct translation of the Synopsis from Moose::Role looks like this:
Class("Eq", {meta: Joose.Role});
requires("isEqual");
methods({
notEqual: function (para) {
return !this.isEqual(para)
}
})
Class("Currency");
does(Eq)
has("value", {is: rw})
methods({
initialize: function (value) {
this.setValue(value)
},
isEqual: function (cur) {
return this.getValue() == cur.getValue()
}
})
check()
The check() makes a "compile time" check of the role requirements. This might later be implemented as an onload-event in browsers.
Joose.Roles are themselves implemented as Joose.Classes. The source looks like this:
Class("Joose.Role");
isa(Joose.Class);
has("requiresMethodNames")
methods({
initialize: function () {
this.name = "Joose.Role"
this.requiresMethodNames = [];
},
addRequirement: function (methodName) {
this.requiresMethodNames.push(methodName)
},
exportTo: function (classObject) {
classObject.meta.importMethods(this.getClassObject())
},
hasRequiredMethods: function (classObject) {
var complete = true
this.requiresMethodNames.each(function (value) {
var found = classObject.meta.can(value)
if(!found) {
complete = false
}
})
return complete
},
isImplementedBy: function (classObject) {
var complete = this.hasRequiredMethods(classObject);
if(complete) {
complete = this.implementsMyMethods(classObject);
}
return complete
}
})
Role are so much more (Score:1)
Careful, roles are not just glorified exporters, there is a lot more details that go into them. For instance, method conflict detection, which is different depending on if you are composing a role into a role or into a class. Otherwise, nice to see some more progress :)
- Stevan
Re: (Score:2)
Re: (Score:1)
Yes, they all made the same mistakes cause they only attempted to replicate what was described in the basic overview paper on Traits. When I wrote Class::Trait, I read that paper as well as the "formal model" papers on the subject, and then re-read those same papers when writing Moose::Role.
Having written several versions of a role system, it is tempting to try and keep it simple, but the reality is that it is not simple. I am only now happy with the current state of Moose roles, all other versions I h
Re: (Score:2)
I'll try to get Moose's roles test suite running eventually. I'm not really sure whether I'll do method wrappers, although the infrastructure is in place.
I'd be interested if you feel that the overall design of Joose hits the spot or if it's doing something fundamentally wrong with respect to meta classes.
Re: (Score:1)
You seem to be on the right track, I will refrain from commenting on specifics since, as you said, its still very early in the life of the project. If you want to discuss specifics though, feel free to email me directly and we can talk.
- Stevan