 +              ');'
 +            );
 +          }
-+          $sig[$i].= '$'.$i;
++          $sig[$i]= '$'.$i;
 +        } else {
 +          $sig[$i]= '$'.$i;
 +        }

+          $sig[$i]= xp::reflect($t->getName()).' $'.$i;
+        } else if (isset($generic[$i])) {
+          if ($generic[$i] instanceof XPClass) {
+            $sig[$i]= $generic[$i]->getSimpleName().' ';
+          } else if ($generic[$i] instanceof Primitive) {
+            $sig[$i]= '';
+            $p= $generic[$i]->getName();
+            $verify.= (
+              ' if (!is_'.$p.'($'.$i.')) throw new IllegalArgumentException('.

  
   /**
    * Represents classes. Every instance of an XP class has an method
@@ -650,8 +651,330 @@
       $details= self::detailsForClass(xp::nameOf($class));
       return $details ? (isset($details[0][$field]) ? $details[0][$field] : NULL) : NULL;
     }
