Arguments:
            event (str): event to subscribe.
            fn (function|coroutinefunction): function to trigger.

        Raises:
            TypeError: if fn argument is not valid

def observe(self, event, fn):
        """
        Arguments:
            event (str): event to subscribe.
            fn (function|coroutinefunction): function to trigger.

        Raises:
            TypeError: if fn argument is not valid
        """
        iscoroutine = asyncio.iscoroutinefunction(fn)
        if not iscoroutine and not isfunction(fn):
            raise TypeError('paco: fn param must be a callable '
                            'object or coroutine function')

        observers = self._pool.get(event)
        if not observers:
            observers = self._pool[event] = []

        # Register the observer
        observers.append(fn if iscoroutine else coroutine_wrapper(fn))