Skip to content

Commit

Permalink
Merge commit '6753bc586300f70a63cf6ae59829b40e25030145'
Browse files Browse the repository at this point in the history
  • Loading branch information
arthurschreiber committed Aug 29, 2013
2 parents 2386b3c + 6753bc5 commit f45b7c7
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 3 deletions.
1 change: 1 addition & 0 deletions vendor/tcloo-ext/lib/autorelease_pool.tcl
@@ -1,3 +1,4 @@
package require "TclOO"
package provide "TclOO::ext::autorelease_pool" "1.0"

oo::class create AutoreleasePool {
Expand Down
8 changes: 5 additions & 3 deletions vendor/tcloo-ext/lib/class.tcl
@@ -1,3 +1,4 @@
package require "TclOO"
package require "TclOO::ext::reference_countable" "1.0"

package provide "TclOO::ext::class" "1.0"
Expand All @@ -8,7 +9,7 @@ oo::class create ext::class {
constructor { args } {
# First, create the MetaClass.
#
# This ensures that e.g. the ::oo::define::classmethod
# This ensures that e.g. the ::oo::define::meta
# works correctly when called inside the definition
# block of a class.
oo::class create [self].Meta
Expand All @@ -22,13 +23,14 @@ oo::class create ext::class {
# Now, collect a list of superclasses and get their MetaClasses
# (if they exist). Take this list of MetaClasses and set them as
# superclasses of our MetaClass.
set superclasses [list "::oo::class"]
set superclasses [list]
foreach class [info class superclasses [self]] {
if { [info object isa object "${class}.Meta"] && [info object isa class "${class}.Meta"] } {
lappend superclasses "${class}.Meta"
}
}
oo::define [self].Meta superclass {*}[lreverse $superclasses]

oo::define [self].Meta superclass {*}$superclasses "::oo::class"

# Finally, change our new class to be an instance of our MetaClass.
# This will set up the inheritance chain and make everything work
Expand Down
1 change: 1 addition & 0 deletions vendor/tcloo-ext/lib/reference_countable.tcl
@@ -1,3 +1,4 @@
package require "TclOO"
package require "TclOO::ext::autorelease_pool" "1.0"

package provide "TclOO::ext::reference_countable" "1.0"
Expand Down
50 changes: 50 additions & 0 deletions vendor/tcloo-ext/spec/class_spec.tcl
@@ -0,0 +1,50 @@
package require "TclOO::ext::class"

ext::class create TestClass {
meta method defined_on_meta {} {
return "meta"
}

self method defined_on_self {} {
return "self"
}

method defined_on_instance {} {
return "instance"
}
}

ext::class create SubClass {
superclass TestClass
}

ext::class create OtherTestClass {

}

ext::class create MultipleSuperClasses {
superclass SubClass OtherTestClass
}

describe "ext::class" {
specify "meta methods are available on classes" {
expect [TestClass defined_on_meta] to equal "meta"
}

specify "subclasses inherit meta methods" {
expect [SubClass defined_on_meta] to equal "meta"
}

specify "each class is an instance of its metaclass" {
expect [info object class TestClass] to equal "::TestClass.Meta"
expect [info object class SubClass] to equal "::SubClass.Meta"
}

specify "the metaclass of a subclass is a subclass of the superclass metaclass" {
expect [info class superclass [info object class SubClass]] to equal [list "::TestClass.Meta" "::oo::class"]
}

specify "the metaclass contains all superclass metaclasses" {
expect [info class superclass [info object class MultipleSuperClasses]] to equal [list "::SubClass.Meta" "::OtherTestClass.Meta" "::oo::class"]
}
}

0 comments on commit f45b7c7

Please sign in to comment.