@Override
    public Set<String> keySet()
    {
        return new Set<String>()
        {
            @Override
            public int size()
            {
                return size;
            }

            @Override
            public boolean isEmpty()
            {
                return size == 0;
            }

            @Override
            public boolean contains( Object o )
            {
                return get( (String) o ) != null;
            }

            @Override
            public Iterator<String> iterator()
            {
                return new Iterator<String>()
                {

                    private final Iterator<WrappedString> topLevelIterator = store.keySet().iterator();
                    private Iterator<String> currentIterator =
                        topLevelIterator.hasNext()? store.get( topLevelIterator.next()).getValue().keySet().iterator() : null;

                        @Override
                        public void remove()
                        {
                            throw new UnsupportedOperationException("Read only data set");
                        }

                        @Override
                        public boolean hasNext()
                        {
                            return currentIterator != null;
                        }

                        @Override
                        public String next()
                        {
                            String toReturn;
                            toReturn = currentIterator.next();
                            if ( currentIterator.hasNext() )
                            {
                                return toReturn;
                            }
                            while ( topLevelIterator.hasNext() && !(
                                    currentIterator = store.get(
                                            topLevelIterator.next() ).getValue().keySet().iterator() ).hasNext() );
                            if ( !currentIterator.hasNext() )
                            {
                                currentIterator = null;
                            }
                            return toReturn;
                        }
                };
            }

            @Override
            public Object[] toArray()
            {
                throw new UnsupportedOperationException( "Not yet" );
            }

            @Override
            public <T> T[] toArray( T[] a )
            {
                throw new UnsupportedOperationException( "Not yet" );
            }

            @Override
            public boolean add( String e )
            {
                throw new UnsupportedOperationException("Read only data set");
            }

            @Override
            public boolean remove( Object o )
            {
                throw new UnsupportedOperationException("Read only data set");
            }

            @Override
            public boolean containsAll( Collection<?> c )
            {
                throw new UnsupportedOperationException( "Not yet" );
            }

            @Override
            public boolean addAll( Collection<? extends String> c )
            {
                throw new UnsupportedOperationException("Read only data set");
            }

            @Override
            public boolean retainAll( Collection<?> c )
            {
                throw new UnsupportedOperationException("Read only data set");
            }

            @Override
            public boolean removeAll( Collection<?> c )
            {
                throw new UnsupportedOperationException("Read only data set");
            }

            @Override
            public void clear()
            {
                throw new UnsupportedOperationException("Read only data set");
            }

        };
    }