Posted to tcl by aspect at Tue Jun 09 12:15:30 GMT 2015view pretty

Index: modules/ooutil/ooutil.tcl
==================================================================
--- modules/ooutil/ooutil.tcl
+++ modules/ooutil/ooutil.tcl
@@ -89,17 +89,21 @@
 }
 
 # Build this *almost* like a class method, but with extra care to avoid nuking
 # the existing method.
 oo::class create oo::class.Delegate {
-    method create {name {script ""}} {
+    method create {name args} {
+        if {![string match ::* $name]} {
+            set ns [uplevel 1 {namespace current}]
+            if {$ns eq "::"} {set ns ""}
+            set name ${ns}::${name}
+        }
         if {[string match *.Delegate $name]} {
-            return [next $name $script]
+            return [next $name {*}$args]
         }
-        set cls [next $name]
-        set delegate [oo::class create $cls.Delegate]
-        uplevel 1 [::list oo::define $cls $script]
+        set delegate [oo::class create $name.Delegate]
+        set cls [next $name {*}$args]
         set superdelegates [list $delegate]
         foreach c [info class superclass $cls] {
             set d $c.Delegate
             if {[info object isa object $d] && [info object isa class $d]} {
                 lappend superdelegates $d

Index: modules/ooutil/ooutil.test
==================================================================
--- modules/ooutil/ooutil.test
+++ modules/ooutil/ooutil.test
@@ -30,13 +30,41 @@
     }
 } -cleanup {
     namespace delete ooutiltest
     rename animal {}
 } -result {::ooutiltest::dog}
+
+test ooutil-classmethod-1 {test ooutil classmethod} -setup {
+	oo::class create ActiveRecord {
+	    classmethod find args { puts "[self] called with arguments: $args" }
+	}
+	oo::class create Table {
+	    superclass ActiveRecord
+	}
+} -body {
+	Table find foo bar
+} -cleanup {
+    rename ActiveRecord {}
+} -output "::Table called with arguments: foo bar\n"
+
+test ooutil-classmethod-2 {test ooutil classmethod in namespace} -setup {
+  namespace eval testns {
+	oo::class create ActiveRecord {
+	    classmethod find args { puts "[self] called with arguments: $args" }
+	}
+	oo::class create Table {
+	    superclass ActiveRecord
+	}
+  }
+} -body {
+	testns::Table find foo bar
+} -cleanup {
+    namespace delete testns
+} -output "::testns::Table called with arguments: foo bar\n"
+
 
 # Test properties
-
 oo::class create foo {
   property color blue
   
   constructor args {
     my InitializePublic