def METHOD_NAME(self, aspect_cls: Type[T_Aspect]) -> Optional[T_Aspect]:
    aspects: list
    if isinstance(self.metadata, MetadataChangeEvent):
        aspects = self.metadata.proposedSnapshot.aspects
    elif isinstance(self.metadata, MetadataChangeProposalWrapper):
        aspects = [self.metadata.aspect]
    elif isinstance(self.metadata, MetadataChangeProposal):
        aspects = []
        # Best effort attempt to deserialize MetadataChangeProposalClass
        if self.metadata.aspectName == aspect_cls.ASPECT_NAME:
            try:
                mcp = MetadataChangeProposalWrapper.try_from_mcpc(self.metadata)
                if mcp:
                    aspects = [mcp.aspect]
            except Exception:
                pass
    else:
        raise ValueError(f"Unexpected type {type(self.metadata)}")
    aspects = [a for a in aspects if isinstance(a, aspect_cls)]
    if len(aspects) > 1:
        logger.warning(f"Found multiple aspects of type {aspect_cls} in MCE {self}")
    return aspects[-1] if aspects else None