public static void figureOutParamDeclarations(PrintStream w, Object... comps) {

        Map<String, Access> m = new HashMap<String, Access>();

        for (Object c : comps) {
            ComponentAccess cp = new ComponentAccess(c);
//            System.out.println("// Parameter from " + objName(cp));
            // over all input slots.
            for (Access fin : cp.inputs()) {
                Role role = fin.getField().getAnnotation(Role.class);
                if (role != null && Annotations.plays(role, Role.PARAMETER)) {
                    // make sure parameter is only there once.
                    m.put(fin.getField().getName(), fin);
                }
            }
        }

        List<String> sl = new ArrayList<String>(m.keySet());
        Collections.sort(sl, new Comparator<String>() {

            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });
        for (String key : sl) {
            Access fin = m.get(key);
            Description d = fin.getField().getAnnotation(Description.class);
            if (d != null) {
                w.println("   @Description(\"" + d.value() + "\")");
            }
            Bound b = fin.getField().getAnnotation(Bound.class);
            if (b != null) {
                w.println("   @Bound(\"" + b.value() + "\")");
            }
            w.println("   @Role(\"" + fin.getField().getAnnotation(Role.class).value() + "\")");
            w.println("   @In public " + fin.getField().getType().getSimpleName() + " " + fin.getField().getName() + ";");
            w.println();
        }
    }