Select the components that will by played (with given options).

        `options` will be passed to :func:`.Optionable.parse_options` if the
        component is a subclass of :class:`Optionable`.

        .. Warning:: this function also setup the options (if given) of the
            selected component. Use :func:`clear_selections` to restore both
            selection and component's options.

        This method may be call at play 'time', before to call :func:`play` to
        run all selected components.

        :param name: name of the component to select
        :type comp_name: str
        :param options: options to set to the components
        :type options: dict

def select(self, comp_name, options=None):
        """ Select the components that will by played (with given options).

        `options` will be passed to :func:`.Optionable.parse_options` if the
        component is a subclass of :class:`Optionable`.

        .. Warning:: this function also setup the options (if given) of the
            selected component. Use :func:`clear_selections` to restore both
            selection and component's options.

        This method may be call at play 'time', before to call :func:`play` to
        run all selected components.

        :param name: name of the component to select
        :type comp_name: str
        :param options: options to set to the components
        :type options: dict
        """
        self._logger.info("select comp '%s' for block '%s' (options: %s)" % (comp_name, self._name, options))
        if comp_name not in self._components:
            raise ValueError("'%s' has no component '%s' (components are: %s)"\
                  % (self._name, comp_name, ", ".join(self.component_names())))
        if options is None:
            options = {}
        # get the componsent
        component = self._components[comp_name]
        # check options make sens
        if not isinstance(component, Optionable) and len(options):
            raise ValueError("the component %s is not optionable you can't provide options..." % comp_name)
        # add component as selected, aware of multiple
        if comp_name not in self._selected:
            if not self.multiple and len(self._selected):
                assert len(self._selected) == 1
                self._selected[0] = comp_name
            else:
                self._selected.append(comp_name)
        else:
            # TODO the component has already been selected
            pass
        # component might be a function or any callable
        # only Optionable will get options
        if isinstance(component, Optionable):
            component.set_options_values(options, parse=True, strict=True)