Index: toltcl/generic/tolaccess.cpp
===================================================================
--- toltcl/generic/tolaccess.cpp	(revision f6c81d24ec579a140b54079905aab5ef500006b9)
+++ toltcl/generic/tolaccess.cpp	(revision 1065545cc8f42c1746551ddf72541a8a5335e119)
@@ -469,7 +469,7 @@
  * 
  */
-const BSyntaxObject * Tol_FindGlobalContainer(const char* Type,
-                                              const char* obj_name,
-                                              Tcl_Obj*    obj_result)
+BSyntaxObject * Tol_FindGlobalContainer(const char* Type,
+                                        const char* obj_name,
+                                        Tcl_Obj*    obj_result)
 {
   BGrammar *gra;
@@ -515,8 +515,8 @@
  */
 
-const BSyntaxObject * Tol_FindChild(Tcl_Interp    *interp,
-                                    const BSyntaxObject *syn_obj,
-                                    Tcl_Obj       **indexes, int n,
-                                    Tcl_Obj       *obj_result)
+BSyntaxObject * Tol_FindChild(Tcl_Interp    *interp,
+                              BSyntaxObject *syn_obj,
+                              Tcl_Obj       **indexes, int n,
+                              Tcl_Obj       *obj_result)
 {
   int tcl_code;
@@ -570,7 +570,7 @@
  */
 
-const BSyntaxObject * Tol_ResolveObject(Tcl_Interp *interp,
-                                        Tcl_Obj    *obj_ref,
-                                        Tcl_Obj    *obj_result)
+BSyntaxObject * Tol_ResolveObject(Tcl_Interp *interp,
+                                  Tcl_Obj    *obj_ref,
+                                  Tcl_Obj    *obj_result)
 {
   Tcl_Obj ** items;
@@ -587,5 +587,5 @@
 
   // this Tcl_Obj is to leave error messages
-  const BSyntaxObject * syn = NULL;
+  BSyntaxObject * syn = NULL;
 
   if (n >= 2) {
@@ -666,5 +666,5 @@
 {
   int j;
-  const BSyntaxObject * so;
+  BSyntaxObject * so;
   
   for (j = 1; j <= ptrSet->Card(); j++) {
@@ -806,4 +806,159 @@
 }
 
+class ContainerIterator
+{
+public:
+
+  static ContainerIterator *New( BSyntaxObject *obj );
+  
+  enum status_t { VALID, INVALID };
+
+  virtual ~ContainerIterator( ) { }
+  
+  status_t GetStatus() const {
+    return m_status;
+  }
+  
+  virtual status_t Begin( ) = 0;
+  virtual BSyntaxObject *Next( ) = 0;
+
+protected:
+
+  ContainerIterator() : m_status( INVALID ) { }
+  
+  status_t m_status;
+};
+
+class SetIterator : public ContainerIterator
+{
+public:
+  SetIterator( BSet *set )
+  {
+    m_set = set;
+    Begin();
+  }
+
+  virtual ~SetIterator( )
+  {
+  }
+  
+  virtual ContainerIterator::status_t Begin()
+  {
+    m_idx = 0;
+    m_status = m_set ? VALID : INVALID;
+    return m_status;
+  }
+  
+  virtual BSyntaxObject *Next()
+  {
+    BSyntaxObject *so = _next();
+    if ( !so ) {
+      /* start over */
+      Begin();
+    }
+    return so;
+  }
+
+protected:
+
+  BSyntaxObject *_next()
+  {
+    if ( m_set ) {
+      ++m_idx;
+      return ( m_idx > m_set->Card( ) ) ? NULL : ( *m_set )[ m_idx ];
+    }
+    return NULL;
+  }
+
+  size_t m_idx;
+  BSet *m_set;
+};
+
+class USetIterator : public SetIterator
+{
+public:
+  USetIterator( BUserSet *uset )
+    : SetIterator( &( uset->Contens( ) ) )
+  {
+  }
+  virtual ~USetIterator() { }
+};
+
+class UNameBlockIterator : public SetIterator
+{
+public:
+  UNameBlockIterator( BUserNameBlock *unb )
+    : SetIterator( &( unb->Contens( ).Set( ) ) ),
+      m_data_static( NULL ),
+      m_methods_static( NULL ),
+      m_methods_instance( NULL ),
+      m_ptr_item( NULL )
+  {
+    const BClass *cls = unb->Contens( ).Class( );
+    if ( cls ) {
+      m_data_static = cls->SelectStaticMembers( NULL );
+      m_methods_static = cls->SelectStaticMethods( NULL );
+      m_methods_instance = cls->SelectNonStaticMethods( NULL );
+    }
+  }
+
+  virtual ~UNameBlockIterator( )
+  {
+    DESTROY( m_data_static );
+    DESTROY( m_methods_static );
+    DESTROY( m_methods_instance );
+  }
+  
+  virtual status_t Begin( )
+  {
+    SetIterator::Begin( );
+    m_ptr_item = NULL;
+    return GetStatus( );
+  }
+  
+  virtual BSyntaxObject *Next()
+  {
+    BSyntaxObject *so;
+    
+    so = _next();
+    
+    if ( so ) {
+      return so;
+    }
+    
+    if ( m_ptr_item ) {
+      m_ptr_item = Cdr( m_ptr_item );
+    } else {
+      m_ptr_item = m_methods_instance;
+    }
+
+    if ( m_ptr_item ) {
+      return (BSyntaxObject*)Car( m_ptr_item );
+    } else {
+      // si despues de avanzar no encuentro 'obj', lo dejo listo para
+      // que de la vuelta
+      Begin( );
+      return NULL;
+    }
+  }
+
+private:
+  BList *m_data_static;
+  BList *m_methods_static;
+  BList *m_methods_instance;
+  BList *m_ptr_item;
+};
+
+ContainerIterator *ContainerIterator::New( BSyntaxObject *obj )
+{
+  if ( obj->Grammar( ) == GraSet( ) ) {
+    return new USetIterator( (BUserSet*)obj );
+  }
+  if ( obj->Grammar( ) == GraNameBlock( ) ) {
+    return new UNameBlockIterator( (BUserNameBlock*)obj );
+  }
+  return NULL;
+}
+
 /*! Implement a foreach proc similar to the one provided in Tcl except
  *  that instead of iterating over the list's items it iterates over
@@ -816,9 +971,9 @@
                  Tcl_Obj * obj_result)
 {
-  const BSyntaxObject* container;
+  BSyntaxObject* container;
   Tcl_DString dstr;
   Tcl_Obj * ArgIndexes;
   int tcl_code = TCL_OK;
-  int i, card ;
+  int i;
   int n, index_length;
   Tcl_Obj ** items;
@@ -873,6 +1028,7 @@
     return TCL_ERROR;
   }
-  BSet *set = ContainerGetSet( container );
-  if (!set) {
+  ContainerIterator *citer = ContainerIterator::New( container );
+  
+  if ( !citer ) {
     Tcl_AppendStringsToObj(obj_result,
                            "object '",
@@ -880,11 +1036,9 @@
                            "' is not a valid container ",
                            NULL);
-      return TCL_ERROR;
-  }
-  
-  card = set->Card();
+    return TCL_ERROR;
+  }
   
   // is ok to ask for a list
-  Tcl_ListObjGetElements( interp, objv[ 0 ], &n, &items );
+  Tcl_ListObjGetElements( interp, objv[ 1 ], &n, &items );
 
   // initialize the list of indexes (the common part) for every item
@@ -912,5 +1066,5 @@
   datav[ OBJ_DESC ]     = Tcl_NewStringObj( "description", -1 );
   datav[ OBJ_DESCV ]    = Tcl_NewObj( );
-  Tcl_Obj * last_index  = Tcl_NewIntObj( 0 );
+  Tcl_Obj * last_index  = Tcl_NewIntObj( 1 );
   Tcl_ListObjAppendElement( NULL, ArgIndexes, last_index );
   datav[ OBJ_INDEXES ]  = Tcl_NewStringObj( "indexes", -1 );
@@ -939,8 +1093,7 @@
   BText btxt;
  
-  for ( i = 1; i <= card; ++i ) {
-    syn_i = ( *set )[ i ];
-    
+  for ( i = 1; ( syn_i = citer->Next( ) ); ++i ) {
     /* read the grammar */
+    
     btxt = syn_i->Grammar( )->Name( );
     Tcl_ExternalToUtfDString( NULL, btxt, -1, &dstr );
@@ -973,17 +1126,18 @@
     Tcl_DStringFree(&dstr);
 
+    /* update last index */
+    if ( Tcl_IsShared( last_index ) ) {
+      last_index = Tcl_NewIntObj( i );
+      Tcl_ListObjReplace( NULL, datav[ OBJ_INDEXESV ], index_length-1,
+                          1, 1, &last_index );
+    } else {
+      Tcl_SetIntObj( last_index, i );
+    }
+    /* to refresh the string */
+    Tcl_InvalidateStringRep( datav[ OBJ_INDEXESV ] );
     // Este if es para incluir en los items que son Set informacion
     // que solo ellos llevan como: Subtype, IsFile, etc ...
+
     if ( ( set_i = ContainerGetSet( syn_i ) ) ) {
-      /* update last index */
-      if ( Tcl_IsShared( last_index ) ) {
-        last_index = Tcl_NewIntObj( i );
-        Tcl_ListObjReplace( NULL, datav[ OBJ_INDEXESV ], index_length-1,
-                           1, 1, &last_index );
-      }
-      /* set the last value index */
-      Tcl_SetIntObj( last_index, i );
-      /* to refresh the string */
-      Tcl_InvalidateStringRep( datav[ OBJ_INDEXESV ] );
       if ( Tcl_IsShared( datav[ OBJ_ISFILEV ] ) ) {
         Tcl_DecrRefCount( datav[ OBJ_ISFILEV ] );
@@ -1060,4 +1214,6 @@
     }
   }
+
+  delete citer;
   
   /* liberar los objetos tcl */
@@ -1084,9 +1240,9 @@
                      Tcl_Obj * obj_result)
 {
-  const BSyntaxObject* container;
+  BSyntaxObject* container;
   Tcl_DString dstr;
   Tcl_Obj * ArgIndexes;
   int tcl_code;
-  int i, card ;
+  int i;
   int n, index_length;
   Tcl_Obj ** items;
@@ -1138,6 +1294,7 @@
     return TCL_ERROR;
   }
-  BSet *set = ContainerGetSet( container );
-  if (!set) {
+  ContainerIterator *citer = ContainerIterator::New( container );
+  
+  if ( !citer ) {
     Tcl_AppendStringsToObj(obj_result,
                            "object '",
@@ -1147,6 +1304,4 @@
       return TCL_ERROR;
   }
-  
-  card = set->Card();
   
   int datac;
@@ -1177,5 +1332,5 @@
   datav[ARG_PATH]    = Tcl_NewObj();
   datav[ARG_DESC]    = Tcl_NewObj();
-  Tcl_Obj * last_index = Tcl_NewIntObj(0);
+  Tcl_Obj * last_index = Tcl_NewIntObj(1);
   Tcl_ListObjAppendElement(NULL,ArgIndexes,last_index);
   datav[ARG_INDEXES] = ArgIndexes;
@@ -1196,6 +1351,5 @@
   BText btxt;
  
-  for ( i = 1; i <= card; ++i ) {
-    syn_i = (*set)[i];
+  for ( i = 1; ( syn_i = citer->Next( ) ); ++i ) {
     
     /* read the grammar */
@@ -1261,7 +1415,8 @@
         Tcl_ListObjReplace(NULL, datav[ARG_INDEXES], index_length-1,
                            1, 1, &last_index);
+      } else {
+        /* set the last value index */
+        Tcl_SetIntObj( last_index, i );
       }
-      /* set the last value index */
-      Tcl_SetIntObj( last_index, i );
       /* to refresh the string */
       Tcl_InvalidateStringRep( datav[ ARG_INDEXES ] );
@@ -1332,4 +1487,7 @@
     Tcl_DecrRefCount( datav[ i ] );
   }
+
+  delete citer;
+  
   delete []datav;
   return tcl_code;
Index: toltcl/generic/toltclInt.h
===================================================================
--- toltcl/generic/toltclInt.h	(revision f6c81d24ec579a140b54079905aab5ef500006b9)
+++ toltcl/generic/toltclInt.h	(revision 1065545cc8f42c1746551ddf72541a8a5335e119)
@@ -313,8 +313,8 @@
  */
 extern
-const BSyntaxObject * Tol_ResolveObject(Tcl_Interp *interp,
-					Tcl_Obj    *obj_ref,
-                                        Tcl_Obj    *obj_result/*,
-                                        BGrammar   *grammar=NULL*/);
+BSyntaxObject * Tol_ResolveObject(Tcl_Interp *interp,
+                                  Tcl_Obj    *obj_ref,
+                                  Tcl_Obj    *obj_result/*,
+                                                          BGrammar   *grammar=NULL*/);
 
 extern
