Searches the tree for a step
        Args:
            value: The value to search for. If value is a string then the search looks for
                a step of that name. If the value is a type, it looks for a step
                of that type.
        Returns: The first step found via a depth-first search.

def get_input(self, value, _search=None):
        """
        Searches the tree for a step
        Args:
            value: The value to search for. If value is a string then the search looks for
                a step of that name. If the value is a type, it looks for a step
                of that type.
        Returns: The first step found via a depth-first search.
        """
        if _search is None:
            if isinstance(value, string_types):
                _search = lambda s: s.name  # noqa: E731
            elif isinstance(value, type):
                _search = type

        for i in self.inputs:
            step = i.get_input(value, _search)
            if step is not None:
                return step

        if _search(self) == value:
            return self