001    // Copyright 2010 Waterken Inc. under the terms of the MIT X license
002    // found at http://www.opensource.org/licenses/mit-license.html
003    package org.ref_send.promise;
004    
005    import java.lang.reflect.Method;
006    import java.lang.reflect.Modifier;
007    
008    import org.joe_e.Powerless;
009    import org.joe_e.reflect.Reflection;
010    
011    /**
012     * Indicates the class provided to {@link Eventual#spawn spawn} is not a Maker.
013     * <p>
014     * A Maker class <strong>MUST</strong>:
015     * </p>
016     * <ul>
017     * <li>be declared in a {@linkplain org.joe_e.IsJoeE Joe-E} package</li>
018     * <li>be <code>public</code></li>
019     * <li>have a single <code>public static</code> method named
020     *     "<code>make</code>"</li>
021     * </ul>
022     */
023    public class
024    NotAMaker extends NullPointerException implements Powerless {
025        static private final long serialVersionUID = 1L;
026        
027        public
028        NotAMaker() {}
029    
030        private
031        NotAMaker(final Class<?> maker) {
032            super(Reflection.getName(maker));
033        }
034        
035        /**
036         * Finds a Maker's make method.
037         * @param maker maker type
038         * @return corresponding make method
039         * @throws NotAMaker    no make method found
040         */
041        static public Method
042        dispatch(final Class<?> maker) throws NotAMaker {
043            Method make = null;
044            for (final Method m : Reflection.methods(maker)) {
045                if ("make".equals(m.getName()) &&
046                        Modifier.isStatic(m.getModifiers())) {
047                    if (null != make) { throw new NotAMaker(maker); }
048                    make = m;
049                }
050            }
051            if (null == make) { throw new NotAMaker(maker); }
052            return make;
053        }
054    }