// Path: richsobjects-interfaces/src/main/java/com/github/ryanbrainard/richsobjects/api/model/SObjectDescription.java
// public interface SObjectDescription extends BasicSObjectDescription, Serializable {
// 
//     List<? extends Field> getFields();
// 
//     List<? extends ChildEntity> getChildRelationships();
// 
//     static interface Field extends Serializable {
//         Integer getLength();
// 
//         String getName();
// 
//         String getType();
// 
//         String getSoapType();
// 
//         String getDefaultValue();
// 
//         String getLabel();
// 
//         Boolean isUpdateable();
// 
//         Boolean isCalculated();
// 
//         Boolean isUnique();
// 
//         Boolean isNillable();
// 
//         Boolean isCaseSensitive();
// 
//         String getInlineHelpText();
// 
//         Boolean isNameField();
// 
//         Boolean isExternalId();
// 
//         Boolean isIdLookup();
// 
//         Boolean isFilterable();
// 
//         Boolean isCreateable();
// 
//         Boolean isDeprecatedAndHidden();
// 
//         Boolean isAutoNumber();
// 
//         Boolean isDefaultedOnCreate();
// 
//         Boolean isGroupable();
// 
//         String getRelationshipName();
// 
//         List<String> getReferenceTo();
// 
//         Boolean isRestrictedPicklist();
// 
//         Boolean isNamePointing();
// 
//         Boolean isCustom();
// 
//         Boolean isHtmlFormatted();
// 
//         Boolean isDependentPicklist();
// 
//         Boolean isWriteRequiresMasterRead();
// 
//         Boolean isSortable();
//     }
// 
//     static interface ChildEntity extends Serializable {
//         String getField();
// 
//         String getChildSObject();
// 
//         String getRelationshipName();
// 
//         Boolean isDeprecatedAndHidden();
// 
//         Boolean isCascadeDelete();
//     }
// }


import com.github.ryanbrainard.richsobjects.api.model.SObjectDescription;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
        return new ImmutableRichField(fieldName.toUpperCase());
    }

    @Override
    public Iterator<RichField> iterator() {
        return getFields();
    }

    @Override
    public Iterator<RichField> getFields() {
        return new Iterator<RichField>() {
            private final Iterator<SObjectDescription.Field> fieldIterator = sortedFieldMetadata.iterator();

            @Override
            public boolean hasNext() {
                return fieldIterator.hasNext();
            }

            @Override
            public RichField next() {
                return getField(fieldIterator.next().getName());
            }

            @Override
            public void remove() {
                throw new UnsupportedOperationException("Fields cannot be removed");
            }
        };
    }

// Path: richsobjects-interfaces/src/main/java/com/github/ryanbrainard/richsobjects/api/model/SObjectDescription.java
// public interface SObjectDescription extends BasicSObjectDescription, Serializable {
// 
//     List<? extends Field> getFields();
// 
//     List<? extends ChildEntity> getChildRelationships();
// 
//     static interface Field extends Serializable {
//         Integer getLength();
// 
//         String getName();
// 
//         String getType();
// 
//         String getSoapType();
// 
//         String getDefaultValue();
// 
//         String getLabel();
// 
//         Boolean isUpdateable();
// 
//         Boolean isCalculated();
// 
//         Boolean isUnique();
// 
//         Boolean isNillable();
// 
//         Boolean isCaseSensitive();
// 
//         String getInlineHelpText();
// 
//         Boolean isNameField();
// 
//         Boolean isExternalId();
// 
//         Boolean isIdLookup();
// 
//         Boolean isFilterable();
// 
//         Boolean isCreateable();
// 
//         Boolean isDeprecatedAndHidden();
// 
//         Boolean isAutoNumber();
// 
//         Boolean isDefaultedOnCreate();
// 
//         Boolean isGroupable();
// 
//         String getRelationshipName();
// 
//         List<String> getReferenceTo();
// 
//         Boolean isRestrictedPicklist();
// 
//         Boolean isNamePointing();
// 
//         Boolean isCustom();
// 
//         Boolean isHtmlFormatted();
// 
//         Boolean isDependentPicklist();
// 
//         Boolean isWriteRequiresMasterRead();
// 
//         Boolean isSortable();
//     }
// 
//     static interface ChildEntity extends Serializable {
//         String getField();
// 
//         String getChildSObject();
// 
//         String getRelationshipName();
// 
//         Boolean isDeprecatedAndHidden();
// 
//         Boolean isCascadeDelete();
//     }
// }


// Path: richsobjects-core/src/main/java/com/github/ryanbrainard/richsobjects/ImmutableRichSObject.java
import com.github.ryanbrainard.richsobjects.api.model.SObjectDescription;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

        return new ImmutableRichField(fieldName.toUpperCase());
    }

    @Override
    public Iterator<RichField> iterator() {
        return getFields();
    }

    @Override
    public Iterator<RichField> getFields() {
        return new Iterator<RichField>() {
            private final Iterator<SObjectDescription.Field> fieldIterator = sortedFieldMetadata.iterator();

            @Override
            public boolean hasNext() {
                return fieldIterator.hasNext();
            }

            @Override
            public RichField next() {
                return getField(fieldIterator.next().getName());
            }

            @Override
            public void remove() {
                throw new UnsupportedOperationException("Fields cannot be removed");
            }
        };
    }

    public class ImmutableRichField implements RichField {