Joose has Roles

malte on 2008-03-05T20:29:04

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

Stevan on 2008-03-05T21:50:35

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:Role are so much more

malte on 2008-03-06T04:23:12

Hey, I need to take the same path as all the Perl Role/Trait modules :)

Re:Role are so much more

Stevan on 2008-03-06T20:35:37

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 had written previously were pretty much the wrong way to do it.

- Stevan

Re:Role are so much more

malte on 2008-03-06T08:05:11

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:Role are so much more

Stevan on 2008-03-06T20:30:40

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