private function parseAnnotations(array $annotations, $createReference = true) {
        $return = $defer = $primary = array();
        $first = $prev = null;
        foreach ($annotations as $property => $annotArray) {
            if (!is_array($annotArray))
                continue;

            foreach ($annotArray as &$desc) {
                $desc = $this->parseSettings(substr($desc, 1));
                if ($prev && !$desc['attrs']['primary']) {
                    $desc['attrs']['after'] = $prev;
                }
                else if (!$prev && !$desc['attrs']['primary']) {
                    $desc['attrs']['first'] = true;
                    $first = $property;
                }

                $prev = Util::camelTo_($property);
                if (strtolower($desc['type']) === 'reference' || strtolower($desc['type']) === 'referencemany') {
                    $defer[$property] = $desc;
                }

                if (isset($desc['attrs']['primary']) && $desc['attrs']['primary']) {
                    $primary['column'] = $property;
                    $desc['attrs']['first'] = true;
                    if ($first) {
                        $return[$first]['attrs']['after'] = Util::camelTo_($property);
                        unset($return[$first]['attrs']['first']);
                        $first = $property;
                    }
                    $primary['desc'] = $desc;
                }

                $return[$property] = $desc;
                break;
            }
        }

        foreach ($defer as $property => &$desc) {
            $desc = $this->parseForReference($property, $desc, $primary, $createReference);
            if ($desc['attrs']['first'] && !$return[$property]['attrs']['first'])
                unset($desc['attrs']['first']);
            if ($return[$property]['attrs']['after'])
                $desc['attrs']['after'] = $return[$property]['attrs']['after'];
        }

        $f = array();
        if ($first) {
            $f[$first] = $return[$first];
            unset($return[$first]);
        }

        return array_merge($f, $return, $defer);
    }