>>231 Squeak Smalltalk
| trait |
trait := Trait named: #FizzBuzz uses: #() category: 'FizzBuzz-Traits'.

trait compile: 'fizzBuzz: spec
  | assoc |
  (self isKindOf: Integer) ifTrue: [Processor activeProcess environmentAt: #fizzBuzz put: self->''''].
  assoc := Processor activeProcess environmentAt: #fizzBuzz.
  ^(assoc key isDivisibleBy: spec key)
    ifTrue: [assoc value: assoc value, spec value; value]
    ifFalse: [assoc value ifEmpty: [assoc key]]'.

trait compile: 'fizz ^self fizzBuzz: 3->''Fizz'''.
trait compile: 'buzz ^self fizzBuzz: 5->''Buzz'''.
trait compile: 'gizz ^self fizzBuzz: 7->''Gizz'''.

{Integer. String} do: [:class | class uses: trait].

1 fizz buzz. "=> 1 "
3 fizz buzz. "=> 'Fizz' "
5 fizz buzz. "=> 'Buzz' "
15 fizz buzz. "=> 'FizzBuzz' "
7 fizz buzz gizz. "=> 'Gizz' "
21 fizz buzz gizz. "=> 'FizzGizz' "
35 fizz buzz gizz. "=> 'BuzzGizz' "
105 fizz buzz gizz. "=> 'FizzBuzzGizz' "
105 fizz gizz buzz. "=> 'FizzGizzBuzz' "