StructInfo(Class<?> clz)
        {
            this.clz = clz;

            Field[] fields = clz.getDeclaredFields();

            List<FieldMarshal> required = new ArrayList<FieldMarshal>();

            for (Field i : fields)
            {
                boolean ignore = Modifier.isStatic(i.getModifiers()) ||
                                 null != i.getAnnotation(Ignore.class);

                if (ignore)
                {
                    continue;
                }

                Counted ctd = i.getAnnotation(Counted.class);
                Counter ctr = i.getAnnotation(Counter.class);

                if (null != ctd)
                {
                    counted.put(i, ctd.counter());
                }
                else if (null != ctr)
                {
                    counters.put(ctr.id(), i);
                }

                required.add(fieldMarshal(this, i));
            }

            Counted struct = clz.getAnnotation(Counted.class);
            if (null != struct)
            {
                if (!counters.containsKey(struct.counter()))
                {
                    throw new IllegalArgumentException();
                }

                length = counters.get(struct.counter());
            }
            else
            {
                length = null;
            }

            sequence = required.toArray(new FieldMarshal[required.size()]);
        }