def METHOD_NAME(self, gc, points, icon_mode=False):
    if len(points) < 1:
        return
    with gc:
        gc.clip_to_rect(self.x, self.y, self.width, self.height)
        gc.set_stroke_color(self.line_color_)
        gc.set_line_width(self.line_width)
        # Draw the body of the arrow
        starts = points
        ends = points + self._cached_vector_data
        gc.begin_path()
        gc.line_set(starts, ends)
        gc.stroke_path()
        if self.arrow_size > 0:
            vec = self._cached_vector_data
            unit_vec = (
                vec / sqrt(vec[:, 0] ** 2 + vec[:, 1] ** 2)[:, newaxis]
            )
            a = 0.707106781  # sqrt(2)/2
            # Draw the left arrowhead (for an arrow pointing straight up)
            arrow_ends = (
                ends
                - array(unit_vec * matrix([[a, a], [-a, a]]))
                * self.arrow_size
            )
            gc.begin_path()
            gc.line_set(ends, arrow_ends)
            gc.stroke_path()
            # Draw the left arrowhead (for an arrow pointing straight up)
            arrow_ends = (
                ends
                - array(unit_vec * matrix([[a, -a], [a, a]]))
                * self.arrow_size
            )
            gc.begin_path()
            gc.line_set(ends, arrow_ends)
            gc.stroke_path()