Avoids the use of global accessors, removing the reliance on global
state. This also makes dependencies explicit in the interface, as
opposed to being hidden
These can be generified together by using a concept type to designate
them. This also has the benefit of not making copies of potentially very
large arrays.