Hi, this is my first post (please be gentle xD) The *#collect:* message commonly return a new collection like the receiver, but this is really unpractical in some cases e.g. col := Set with: 'one'->1 with: 'two'->2 with: 'dos'->2. (col collect: [:each | each value ]) sum In this example *#sum* will return 3 *instead of 5* (I searched a test for * #sum* but I didn´t find it). Ok, I can use the message *#asBag* (or something like that) but does the second line have to depend on the type of the receiver (i.e. the type of col )? For example, the implementation of* #collect:* in SortedCollection returns an OrderedCollection (in the current image) and in other dialects the message *#collect:* when the receiver is a Set returns a Bag ... Basically, what do you think of an implementation like this? Set >> collect: aBlock *"Evaluate aBlock with each of the receiver's elements as the argument. Collect the resulting values into a Bag. Answer the new collection."* | newBag | newBag := *Bag *new: self size. array do: [:each | each ifNotNil: [newBag add: (aBlock value: each)]]. ^ newBag Cordially, -- Germán Leiva LeivaGerman@gmail.com