public Peer GetPeer(Type clr_type)
    {
        Peer peer;

        if (Peer.CLRIsValueType(clr_type))
        {
            peer = this[clr_type];
            if (peer != null)
            {
                return(peer);
            }

            if (Peer.CLRIsEnum(clr_type))
            {
                peer = this[Peer.CLRUnderlyingType(clr_type)];
                if (peer != null)
                {
                    return(peer);
                }

                throw new ArgumentException("Could not find peer or underlying peer for enum " + clr_type);
            }
            else
            {
                throw new ArgumentException("Could not find peer for value type " + clr_type);
            }
        }
        else
        {
            Type type = clr_type;
            while (type != null)
            {
                peer = this[type];
                if (peer != null)
                {
                    return(peer);
                }

                type = type.BaseType;
            }

            throw new ArgumentException("Could not find peer for class " + clr_type);
        }
    }