:return:
            a proxy to ``bot`` with these modifications:

            - all ``send*`` methods augmented by :meth:`augment_send`
            - all ``edit*`` methods augmented by :meth:`augment_edit`
            - ``deleteMessage()`` augmented by :meth:`augment_delete`
            - all other public methods, including properties, copied unchanged

def augment_bot(self, bot):
        """
        :return:
            a proxy to ``bot`` with these modifications:

            - all ``send*`` methods augmented by :meth:`augment_send`
            - all ``edit*`` methods augmented by :meth:`augment_edit`
            - ``deleteMessage()`` augmented by :meth:`augment_delete`
            - all other public methods, including properties, copied unchanged
        """
        # Because a plain object cannot be set attributes, we need a class.
        class BotProxy(object):
            pass

        proxy = BotProxy()

        send_methods = ['sendMessage',
                        'forwardMessage',
                        'sendPhoto',
                        'sendAudio',
                        'sendDocument',
                        'sendSticker',
                        'sendVideo',
                        'sendVoice',
                        'sendVideoNote',
                        'sendLocation',
                        'sendVenue',
                        'sendContact',
                        'sendGame',
                        'sendInvoice',
                        'sendChatAction',]

        for method in send_methods:
            setattr(proxy, method, self.augment_send(getattr(bot, method)))

        edit_methods = ['editMessageText',
                        'editMessageCaption',
                        'editMessageReplyMarkup',]

        for method in edit_methods:
            setattr(proxy, method, self.augment_edit(getattr(bot, method)))

        delete_methods = ['deleteMessage']

        for method in delete_methods:
            setattr(proxy, method, self.augment_delete(getattr(bot, method)))

        def public_untouched(nv):
            name, value = nv
            return (not name.startswith('_')
                    and name not in send_methods + edit_methods + delete_methods)

        for name, value in filter(public_untouched, inspect.getmembers(bot)):
            setattr(proxy, name, value)

        return proxy