Skip to content

Commit

Permalink
- tested correctness of mutability of builder class
Browse files Browse the repository at this point in the history
  • Loading branch information
canonic-epicure committed Jan 10, 2010
1 parent 75c698c commit 964e17d
Show file tree
Hide file tree
Showing 9 changed files with 195 additions and 57 deletions.
6 changes: 3 additions & 3 deletions META.json
Expand Up @@ -7,7 +7,7 @@
"url" : "http://module-build.sourceforge.net/META-spec-v1.4.html"
},
"generated_by" : "Module::Build version 0.35",
"version" : "3.002",
"version" : "3.003",
"name" : "Joose",
"author" : [
"Nickolay Platonov (aka SamuraiJack) <nplatonov@cpan.org>"
Expand All @@ -31,7 +31,7 @@
"file" : "lib/Joose/Manual/Traits.js"
},
"Joose" : {
"version" : "3.002",
"version" : "3.003",
"file" : "lib/Joose.js"
},
"Joose.Meta.Object" : {
Expand Down Expand Up @@ -191,7 +191,7 @@
"file" : "lib/Joose/Manual/FAQ.js"
},
"Task.Joose.Core" : {
"version" : "3.002",
"version" : "3.003",
"file" : "lib/Task/Joose/Core.js"
},
"Joose.Manual.Installation" : {
Expand Down
10 changes: 6 additions & 4 deletions lib/Joose.js
Expand Up @@ -129,10 +129,12 @@ Joose.O = {

//initializers

Joose.I.Array = function () { return [] }
Joose.I.Object = function () { return {} }
Joose.I.Function = function () { return function () {} }
Joose.I.Now = function () { return new Date() }
Joose.I = {
Array : function () { return [] },
Object : function () { return {} },
Function : function () { return function () {} },
Now : function () { return new Date() }
}



Expand Down
25 changes: 7 additions & 18 deletions lib/Joose/Managed/Class.js
Expand Up @@ -14,6 +14,7 @@ Joose.Managed.Class = new Joose.Proto.Class('Joose.Managed.Class', {
firstPass : true,


//build for metaclasses - collects traits from roles
BUILD : function () {
var props = Joose.Managed.Class.superClass.BUILD.apply(this, arguments)

Expand Down Expand Up @@ -70,6 +71,12 @@ Joose.Managed.Class = new Joose.Proto.Class('Joose.Managed.Class', {

this.builder = new this.builderClass({ targetMeta : this })
this.stem = new this.stemClass({ name : this.name, targetMeta : this })

var builderClass = this.getAttributedClass('builderClass')
if (builderClass) this.addAttribute('builderClass', this.subClassOf(builderClass))

var stemClass = this.getAttributedClass('stemClass')
if (stemClass) this.addAttribute('stemClass', this.subClassOf(stemClass))
},


Expand All @@ -94,34 +101,16 @@ Joose.Managed.Class = new Joose.Proto.Class('Joose.Managed.Class', {

getBuilderTarget : function () {
var builderClass = this.getAttributedClass('builderClass')

if (this.builderClassMutated) return builderClass

if (!builderClass) throw "Attempt to extend a builder on non-meta class"

this.builderClassMutated = true

builderClass = this.subClassOf(builderClass)

this.addAttribute('builderClass', builderClass)

return builderClass
},


getStemTarget : function () {
var stemClass = this.getAttributedClass('stemClass')

if (this.stemClassMutated) return stemClass

if (!stemClass) throw "Attempt to extend a stem on non-meta class"

this.stemClassMutated = true

stemClass = this.subClassOf(stemClass)

this.addAttribute('stemClass', stemClass)

return stemClass
},

Expand Down
4 changes: 1 addition & 3 deletions lib/Joose/Proto/Object.js
Expand Up @@ -32,9 +32,7 @@
},


BUILD : function () {
var config = arguments[0]

BUILD : function (config) {
return arguments.length == 1 && typeof config == 'object' && config || {}
},

Expand Down
39 changes: 14 additions & 25 deletions lib/Task/Joose/Core.js
Expand Up @@ -129,10 +129,12 @@ Joose.O = {

//initializers

Joose.I.Array = function () { return [] }
Joose.I.Object = function () { return {} }
Joose.I.Function = function () { return function () {} }
Joose.I.Now = function () { return new Date() }
Joose.I = {
Array : function () { return [] },
Object : function () { return {} },
Function : function () { return function () {} },
Now : function () { return new Date() }
}



Expand Down Expand Up @@ -595,9 +597,7 @@ Joose.Proto.Empty.meta = {
},


BUILD : function () {
var config = arguments[0]

BUILD : function (config) {
return arguments.length == 1 && typeof config == 'object' && config || {}
},

Expand Down Expand Up @@ -2062,6 +2062,7 @@ Joose.Managed.Class = new Joose.Proto.Class('Joose.Managed.Class', {
firstPass : true,


//build for metaclasses - collects traits from roles
BUILD : function () {
var props = Joose.Managed.Class.superClass.BUILD.apply(this, arguments)

Expand Down Expand Up @@ -2118,6 +2119,12 @@ Joose.Managed.Class = new Joose.Proto.Class('Joose.Managed.Class', {

this.builder = new this.builderClass({ targetMeta : this })
this.stem = new this.stemClass({ name : this.name, targetMeta : this })

var builderClass = this.getAttributedClass('builderClass')
if (builderClass) this.addAttribute('builderClass', this.subClassOf(builderClass))

var stemClass = this.getAttributedClass('stemClass')
if (stemClass) this.addAttribute('stemClass', this.subClassOf(stemClass))
},


Expand All @@ -2142,34 +2149,16 @@ Joose.Managed.Class = new Joose.Proto.Class('Joose.Managed.Class', {

getBuilderTarget : function () {
var builderClass = this.getAttributedClass('builderClass')

if (this.builderClassMutated) return builderClass

if (!builderClass) throw "Attempt to extend a builder on non-meta class"

this.builderClassMutated = true

builderClass = this.subClassOf(builderClass)

this.addAttribute('builderClass', builderClass)

return builderClass
},


getStemTarget : function () {
var stemClass = this.getAttributedClass('stemClass')

if (this.stemClassMutated) return stemClass

if (!stemClass) throw "Attempt to extend a stem on non-meta class"

this.stemClassMutated = true

stemClass = this.subClassOf(stemClass)

this.addAttribute('stemClass', stemClass)

return stemClass
},

Expand Down
8 changes: 4 additions & 4 deletions t/020_managed_class.t.js
Expand Up @@ -48,12 +48,12 @@ StartTest(function (t) {
//==================================================================================================================================================================================
t.diag("Extending of builder")

var TestMetaClass = new Joose.Managed.Class('TestClass1', {
var TestMetaClass = new Joose.Managed.Class('TestMetaClass', {
isa : Joose.Managed.Class,

builder : {
methods : {
testHandler : function (meta, props) {
testBuilder : function (meta, props) {
var name = props.name
var value = props.value

Expand All @@ -70,7 +70,7 @@ StartTest(function (t) {
var TestClass1 = new TestMetaClass('TestClass1', {
isa : TestClass,

testHandler : {
testBuilder : {
name : 'result',
value : 'TestClass1'
}
Expand All @@ -83,7 +83,7 @@ StartTest(function (t) {


var TestClass11 = new TestMetaClass('TestClass11', {
testHandler : {
testBuilder : {
name : 'result',
value : 'TestClass11'
}
Expand Down
93 changes: 93 additions & 0 deletions t/023_builder_stem_inheritance.t.js
@@ -0,0 +1,93 @@
StartTest(function (t) {

t.plan(7)

//==================================================================================================================================================================================
t.diag("Sanity")

t.ok(Joose.Managed.Class, "Joose.Managed.Class is here")


//==================================================================================================================================================================================
t.diag("Inheritance of builder class")

var BaseMetaClass = new Joose.Managed.Class('BaseMetaClass', {
isa : Joose.Managed.Class,

builder : {
methods : {
testBuilder : function (meta, props) {
var name = props.name
var value = props.value

meta.addMethod(name, function () {
return value
})
}
}
}

}).c


var TestClass1 = new BaseMetaClass('TestClass1', {

testBuilder : {
name : 'result',
value : 'TestClass1'
}

}).c

var testClass1 = new TestClass1()

t.ok(TestClass1.meta.hasOwnMethod('result') && testClass1.result() == 'TestClass1', "Builder was extened and works correctly #1")

t.ok(BaseMetaClass.meta.getAttributedClass('builderClass').meta.hasMethod('testBuilder'), "BaseMetaClass extended its builder class")



var SuperMetaClass = new Joose.Managed.Class('SuperMetaClass', {

isa : BaseMetaClass,

builder : {
methods : {
testBuilder2 : function (meta, props) {
var name = props.name
var value = props.value

meta.addMethod(name, function () {
return name
})
}
}
}
}).c


t.ok(SuperMetaClass.meta.getAttributedClass('builderClass').meta.hasMethod('testBuilder'), "'SuperMetaClass' inherited 'testBuilder'")
t.ok(SuperMetaClass.meta.getAttributedClass('builderClass').meta.hasMethod('testBuilder2'), "'SuperMetaClass' received 'testBuilder2'")



var TestClass2 = new SuperMetaClass('TestClass2', {

testBuilder : {
name : 'result',
value : 'TestClass2'
},

testBuilder2 : {
name : 'result2',
value : 'TestClass2'
}

}).c

var testClass2 = new TestClass2()

t.ok(TestClass2.meta.hasOwnMethod('result') && testClass2.result() == 'TestClass2', "Builder was inherited #1")
t.ok(TestClass2.meta.hasOwnMethod('result2') && testClass2.result2() == 'result2', "Builder was extened and works correctly #2")

})
65 changes: 65 additions & 0 deletions t/024_builder_stem_inheritance.t.js
@@ -0,0 +1,65 @@
StartTest(function (t) {

t.plan(5)

//==================================================================================================================================================================================
t.diag("Sanity")

t.ok(Joose.Managed.Class, "Joose.Managed.Class is here")


//==================================================================================================================================================================================
t.diag("Defining a metaclass with unmodified builder class")

var BaseMetaClass = new Joose.Managed.Class('BaseMetaClass', {
isa : Joose.Managed.Class
}).c



var SuperMetaClass = new Joose.Managed.Class('SuperMetaClass', {

isa : BaseMetaClass,

builder : {
methods : {
testBuilder2 : function (meta, props) {
var name = props.name
var value = props.value

meta.addMethod(name, function () {
return name
})
}
}
}
}).c


t.ok(SuperMetaClass.meta.getAttributedClass('builderClass').meta.hasMethod('testBuilder2'), "'SuperMetaClass' received 'testBuilder2'")
t.ok(!BaseMetaClass.meta.getAttributedClass('builderClass').meta.hasMethod('testBuilder2'), "BaseMetaClass don't received 'testBuilder2'")

//==================================================================================================================================================================================
t.diag("Mutation of builder class")


BaseMetaClass.meta.extend({
builder : {
methods : {
testBuilder : function (meta, props) {
var name = props.name
var value = props.value

meta.addMethod(name, function () {
return value
})
}
}
}
})

t.ok(BaseMetaClass.meta.getAttributedClass('builderClass').meta.hasMethod('testBuilder'), "BaseMetaClass extended its builder class")

t.ok(SuperMetaClass.meta.getAttributedClass('builderClass').meta.hasMethod('testBuilder2'), "and it reflected in sub-meta-classes")

})
2 changes: 2 additions & 0 deletions t/index.html
Expand Up @@ -47,6 +47,8 @@
'020_managed_class.t.js',
'021_method_modifiers.t.js',
'022_inheriting_from_proto_class.t.js',
'023_builder_stem_inheritance.t.js',
'024_builder_stem_inheritance.t.js',
'031_managed_role.t.js',
'032_role_application_basic.t.js',
'033_role_application_sugar.t.js',
Expand Down

0 comments on commit 964e17d

Please sign in to comment.