/*
 * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package pkg1;

/**
 * Some people we love to quote.
 */
public enum QuotablePerson {

    /** "Beware of all enterprises that require new clothes." */
    Thoreau,

    /**
     * "A point of view can be a dangerous luxury when substituted for
     * insight and understanding."
     */
    McLuhan,

    /**
     * "If they can keep you asking the wrong questions, they don't have to
     * worry about the answers."
     */
    Pynchon,

    /**
     * "For every problem, there is a solution that is simple, elegant,
     * and wrong."
     */
    Mencken,

    /**
     * "Formerly unsolvable equations are dealt with by threats of reprisals."
     */
    Allen,

    /** "It is not enough to succeed.  Others must fail." */
    Vidal,

    /** "Entia non sunt multiplicanda praeter necessitatem." */
    Occam,

    /**
     * "Love is a snowmobile racing across the tundra and then suddenly it
     * flips over, pinning you underneath.  At night, the ice weasels come."
     */
    Groening,

    /** "Sed Quis custodiet ipsos custodes?" */
    Juvenal,

    /**
     * "The list could surely go on, and there is nothing more wonderful
     * than a list, instrument of wondrous hypotyposis."
     */
    Eco
}
