# Adding a Release test to check for shadowed vars defined at the level of a
class
Imagine we make a class like this:
Object subclass: #MyClass
instanceVariableNames: 'Array i'
classVariableNames: 'Object'
package: 'MyPackage'
We can ask the class for all the variables it defines with #definedVariables.
Thus is is easy to filter
for the shadowing variables:
```Smalltalk
MyClass definedVariables select: [ :variable | variable isShadowing ]
"{#Array => InstanceVariableSlot. #Object->nil}"
```
With this, we now can easily scan the whole system for problematic classes:
```Smalltalk
Smalltalk globals allBehaviors select: [ :class |
class definedVariables anySatisfy: [:var | var isShadowing]].
```
And interestingly, this returns results! Of course, our class MyClass as
defined above, but in addition we do have 6 classes
where class variables shadow globals. We should fix them at some point.
For now, we can add a release test that ensures that we do not add more cases:
```Smalltalk
testClassesShadow
| classes validExceptions remaining |
classes := Smalltalk globals allBehaviors select: [ :class |
class definedVariables anySatisfy: [:var | var isShadowing]].
validExceptions := #().
remaining := classes asOrderedCollection reject: [ :each |
validExceptions includes: each name].
"6 left that we need to fix"
self assert: remaining size <= 6.
```
What we need next is a Code Critique rule. This for once warns developers
early, but in addition it will
make it much easier to fix the 6 problem cases seen above.