Skip to content

Commit

Permalink
- cleaned up add/remove role
Browse files Browse the repository at this point in the history
  • Loading branch information
canonic-epicure committed Oct 23, 2009
1 parent 6fd9f70 commit f163f52
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 106 deletions.
5 changes: 2 additions & 3 deletions TODO
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,6 @@ REFACTORING POSSIBILITIES
- metaclass as subclass of stem?


- refactor addRole (add something like 'beforeAdd' hook, which is very often needs to be overridden)

- convert all OVERRIDE modifiers in core to AROUND? (need to benchmark them 1st)

- merge Containable to something
Expand Down Expand Up @@ -96,4 +94,5 @@ DONE
- does for superclasses
- migrate to github
- add override check for PUT modifiers
- fix namespace managers executeIn to omit the args?
- fix namespace managers executeIn to omit the args?
- refactor addRole (add something like 'beforeAdd' hook, which is very often needs to be overridden)
10 changes: 4 additions & 6 deletions lib/Joose/Managed/Builder.js
Original file line number Diff line number Diff line change
Expand Up @@ -148,9 +148,8 @@ Joose.Managed.Builder = new Joose.Proto.Class('Joose.Managed.Builder', {

if (!targetMeta.meta.isDetached) throw "Can't apply trait to not detached class"

Joose.A.each(Joose.O.wantArray(info), function (metaRole) {

// targetClassMeta.metaRoles.addProperty(metaRole.meta.name, { init : metaRole })
targetMeta.meta.extend({
does : info
})
},

Expand All @@ -163,9 +162,8 @@ Joose.Managed.Builder = new Joose.Proto.Class('Joose.Managed.Builder', {
removeTraits : function (targetMeta, info) {
if (!targetMeta.meta.isDetached) throw "Can't remove trait from not detached class"

Joose.A.each(Joose.O.wantArray(info), function (metaRole) {

// targetClassMeta.metaRoles.removeProperty(metaRole.meta.name)
targetMeta.meta.extend({
doesnot : info
})
}

Expand Down
83 changes: 42 additions & 41 deletions lib/Joose/Managed/Class.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ Joose.Managed.Class = new Joose.Proto.Class('Joose.Managed.Class', {
Joose.A.each(Joose.O.wantArray(props.does || []), function (arg) {
var role = (arg.meta instanceof Joose.Managed.Class) ? arg : arg.role

if (role.meta.isDetached) traits.push(role.meta.meta.superClass)
if (role.meta.meta.isDetached) traits.push(role.meta.meta.superClass)
}, this)

if (traits.length) props.traits = traits
Expand Down Expand Up @@ -190,63 +190,64 @@ Joose.Managed.Class = new Joose.Proto.Class('Joose.Managed.Class', {
},


//XXX method need sanitizing
addRole : function () {

// if (this.firstPass) return
//
// Joose.A.each(arguments, function (arg) {
// var role = (arg.meta instanceof Joose.Managed.Class) ? arg : arg.role
//
//// if (role.meta.meta.hasAttribute('metaRoles') && role.meta.metaRoles) this.metaRoles.addComposeInfo(role.meta.metaRoles)
// }, this)



Joose.A.each(arguments, function (arg) {
//instanceof Class to allow treat classes as roles
eachRole : function (roles, func, scope) {
Joose.A.each(roles, function (arg, index) {
var role = (arg.meta instanceof Joose.Managed.Class) ? arg : arg.role

if (role.meta.builderRole) this.getBuilderTarget().meta.extend({
does : [ role.meta.builderRole ]
})
func.call(scope || this, arg, role, index)
}, this)
},


addRole : function () {

this.eachRole(arguments, function (arg, role) {

if (role.meta.stemRole) this.getStemTarget().meta.extend({
does : [ role.meta.stemRole ]
})
this.beforeRoleAdd(role)

var desc = arg

//instanceof Class to allow treat classes as roles
if (!(desc.meta instanceof Joose.Managed.Class)) {
desc.propertySet = desc.role.meta.stem
if (role != arg) {
desc.propertySet = role.meta.stem
delete desc.role
} else
desc = desc.meta.stem

this.stem.addComposeInfo(desc)

}, this)
},


removeRole : function () {
beforeRoleAdd : function (role) {
if (role.meta.builderRole) this.getBuilderTarget().meta.extend({
does : [ role.meta.builderRole ]
})

// if (this.firstPass) return
//
// Joose.A.each(arguments, function (role) {
//// if (role.meta.meta.hasAttribute('metaRoles') && role.meta.metaRoles) this.metaRoles.removeComposeInfo(role.meta.metaRoles)
// }, this)
if (role.meta.stemRole) this.getStemTarget().meta.extend({
does : [ role.meta.stemRole ]
})

Joose.A.each(arguments, function (role) {

if (role.meta.builderRole) this.getBuilderTarget().meta.extend({
doesnt : [ role.meta.builderRole ]
})

if (role.meta.stemRole) this.getStemTarget().meta.extend({
doesnt : [ role.meta.stemRole ]
})

if (role.meta.meta.isDetached && !this.firstPass) this.builder.traits(this, role.meta.meta.superClass)
},


beforeRoleRemove : function (role) {
if (role.meta.builderRole) this.getBuilderTarget().meta.extend({
doesnt : [ role.meta.builderRole ]
})

if (role.meta.stemRole) this.getStemTarget().meta.extend({
doesnt : [ role.meta.stemRole ]
})

if (role.meta.meta.isDetached && !this.firstPass) this.builder.removeTraits(this, role.meta.meta.superClass)
},


removeRole : function () {
this.eachRole(arguments, function (arg, role) {
this.beforeRoleRemove(role)

this.stem.removeComposeInfo(role.meta.stem)
}, this)
Expand Down
93 changes: 46 additions & 47 deletions lib/Task/Joose/Core.js
Original file line number Diff line number Diff line change
Expand Up @@ -2145,9 +2145,8 @@ Joose.Managed.Builder = new Joose.Proto.Class('Joose.Managed.Builder', {

if (!targetMeta.meta.isDetached) throw "Can't apply trait to not detached class"

Joose.A.each(Joose.O.wantArray(info), function (metaRole) {

// targetClassMeta.metaRoles.addProperty(metaRole.meta.name, { init : metaRole })
targetMeta.meta.extend({
does : info
})
},

Expand All @@ -2160,9 +2159,8 @@ Joose.Managed.Builder = new Joose.Proto.Class('Joose.Managed.Builder', {
removeTraits : function (targetMeta, info) {
if (!targetMeta.meta.isDetached) throw "Can't remove trait from not detached class"

Joose.A.each(Joose.O.wantArray(info), function (metaRole) {

// targetClassMeta.metaRoles.removeProperty(metaRole.meta.name)
targetMeta.meta.extend({
doesnot : info
})
}

Expand Down Expand Up @@ -2195,7 +2193,7 @@ Joose.Managed.Class = new Joose.Proto.Class('Joose.Managed.Class', {
Joose.A.each(Joose.O.wantArray(props.does || []), function (arg) {
var role = (arg.meta instanceof Joose.Managed.Class) ? arg : arg.role

if (role.meta.isDetached) traits.push(role.meta.meta.superClass)
if (role.meta.meta.isDetached) traits.push(role.meta.meta.superClass)
}, this)

if (traits.length) props.traits = traits
Expand Down Expand Up @@ -2361,63 +2359,64 @@ Joose.Managed.Class = new Joose.Proto.Class('Joose.Managed.Class', {
},


//XXX method need sanitizing
addRole : function () {

// if (this.firstPass) return
//
// Joose.A.each(arguments, function (arg) {
// var role = (arg.meta instanceof Joose.Managed.Class) ? arg : arg.role
//
//// if (role.meta.meta.hasAttribute('metaRoles') && role.meta.metaRoles) this.metaRoles.addComposeInfo(role.meta.metaRoles)
// }, this)



Joose.A.each(arguments, function (arg) {
//instanceof Class to allow treat classes as roles
eachRole : function (roles, func, scope) {
Joose.A.each(roles, function (arg, index) {
var role = (arg.meta instanceof Joose.Managed.Class) ? arg : arg.role

if (role.meta.builderRole) this.getBuilderTarget().meta.extend({
does : [ role.meta.builderRole ]
})
func.call(scope || this, arg, role, index)
}, this)
},


addRole : function () {

this.eachRole(arguments, function (arg, role) {

if (role.meta.stemRole) this.getStemTarget().meta.extend({
does : [ role.meta.stemRole ]
})
this.beforeRoleAdd(role)

var desc = arg

//instanceof Class to allow treat classes as roles
if (!(desc.meta instanceof Joose.Managed.Class)) {
desc.propertySet = desc.role.meta.stem
if (role != arg) {
desc.propertySet = role.meta.stem
delete desc.role
} else
desc = desc.meta.stem

this.stem.addComposeInfo(desc)

}, this)
},


removeRole : function () {
beforeRoleAdd : function (role) {
if (role.meta.builderRole) this.getBuilderTarget().meta.extend({
does : [ role.meta.builderRole ]
})

// if (this.firstPass) return
//
// Joose.A.each(arguments, function (role) {
//// if (role.meta.meta.hasAttribute('metaRoles') && role.meta.metaRoles) this.metaRoles.removeComposeInfo(role.meta.metaRoles)
// }, this)
if (role.meta.stemRole) this.getStemTarget().meta.extend({
does : [ role.meta.stemRole ]
})

Joose.A.each(arguments, function (role) {

if (role.meta.builderRole) this.getBuilderTarget().meta.extend({
doesnt : [ role.meta.builderRole ]
})

if (role.meta.stemRole) this.getStemTarget().meta.extend({
doesnt : [ role.meta.stemRole ]
})

if (role.meta.meta.isDetached && !this.firstPass) this.builder.traits(this, role.meta.meta.superClass)
},


beforeRoleRemove : function (role) {
if (role.meta.builderRole) this.getBuilderTarget().meta.extend({
doesnt : [ role.meta.builderRole ]
})

if (role.meta.stemRole) this.getStemTarget().meta.extend({
doesnt : [ role.meta.stemRole ]
})

if (role.meta.meta.isDetached && !this.firstPass) this.builder.removeTraits(this, role.meta.meta.superClass)
},


removeRole : function () {
this.eachRole(arguments, function (arg, role) {
this.beforeRoleRemove(role)

this.stem.removeComposeInfo(role.meta.stem)
}, this)
Expand Down
14 changes: 5 additions & 9 deletions t/054_meta_roles.t.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ StartTest(function (t) {
t.diag("MetaRoles (roles which applies to metaclass of applicant")

t.ok(Joose.Managed.Property.MetaRole, "Joose.Managed.Property.MetaRole is here")
// t.ok(Joose.Managed.StemElement.MetaRoles, "Joose.Managed.StemElement.MetaRoles is here")
// t.ok(Joose.Trait.Able, "Joose.Trait.Able is here")


Role('MetaRole', {
Expand All @@ -30,14 +28,12 @@ StartTest(function (t) {
}

})

// debugger


Class('TestClass', {

traits : MetaRole

})

t.ok(TestClass, 'TestClass class was created')

t.ok(TestClass.meta.meta.isDetached, "TestClass's meta is detached")
Expand Down Expand Up @@ -88,7 +84,7 @@ StartTest(function (t) {

Role('CustomBuilderWrapper', {

trait : CustomBuilder,
traits : CustomBuilder,

sugar : {
name : 'custom',
Expand All @@ -98,7 +94,7 @@ StartTest(function (t) {
})

t.ok(CustomBuilderWrapper, 'CustomBuilderWrapper role was created')
t.ok(CustomBuilderWrapper.meta.isDetached, "CustomBuilderWrapper's meta is detached (Role consume metaroles also)")
t.ok(CustomBuilderWrapper.meta.meta.isDetached, "CustomBuilderWrapper's meta is detached (Role consume metaroles also)")

t.ok(CustomBuilderWrapper.meta.hasAttribute('custom') && CustomBuilderWrapper.meta.getAttribute('custom').value == 'attribute', "CustomBuilderWrapper has correct attribute 'custom'")

Expand All @@ -116,7 +112,7 @@ StartTest(function (t) {
t.ok(TestClass2, 'TestClass2 class was created')


t.ok(TestClass2.meta.isDetached, "TestClass2's meta is detached")
t.ok(TestClass2.meta.meta.isDetached, "TestClass2's meta is detached")

t.ok(TestClass2.meta.builder.meta.hasMethod('sugar'), "TestClass2's builder received new method")

Expand Down

0 comments on commit f163f52

Please sign in to comment.