package com.novoda.downloadmanager.lib;

import java.lang.reflect.Field;

final class Reflector {

    private static final String CLASS_NAME = "com.novoda.downloadmanager.Authority";
    private static final String CONSTANT_FULL_NAME = CLASS_NAME + ".AUTHORITY";

    private static String cachedAuthority;

    private Reflector() {

    }

    static String reflectAuthority() {
        if (cachedAuthority == null) {
            try {
                Class<?> authorityClass = Class.forName(CLASS_NAME);
                Field authorityField = authorityClass.getDeclaredField("AUTHORITY");
                Object o = authorityField.get(authorityClass);
                cachedAuthority = (String) o;
            } catch (ClassNotFoundException e) {
                throwNoAuthorityClass();
            } catch (NoSuchFieldException e) {
                throwNoAuthorityField();
            } catch (IllegalAccessException e) {
                throwHiddenFieldName();
            } catch (ClassCastException e) {
                throwNotAString();
            }
        }
        return cachedAuthority;
    }

    private static void throwNotAString() {
        throw new IllegalArgumentException(CONSTANT_FULL_NAME + " is not a string");
    }

    private static void throwHiddenFieldName() {
        throw new IllegalStateException(CONSTANT_FULL_NAME + " is not a visible field");
    }

    private static void throwNoAuthorityField() {
        throw new NullPointerException(CONSTANT_FULL_NAME + " was not defined");
    }

    private static void throwNoAuthorityClass() {
        throw new NullPointerException(CLASS_NAME + " is not defined. See the documentation.");
    }
}

@@ -328,16 +328,46 @@
 tor() %7B%0A
+        // static helper class
 %0A    %7D%0A%0A

comment empty constructor to make ppl understand