protected override void Execute()
    {
        IHook          hook          = hookRef.Get();
        IGrapplingHook grapplingHook = grapplingHookRef.Get();
        Vector2        ownerPosition = weaponRef.Get().Owner.transform.position;

        RaycastHit2D hitToAnchor = Physics2D.Linecast(ownerPosition, hook.Anchors[0].position, hook.RopeRaycastLayerMask);

        if (hitToAnchor.collider != null)
        {
            Vector2 anchorPosition = hitToAnchor.point + (ownerPosition - hitToAnchor.point).normalized * 0.1f;
            addHookAnchorEvent.Dispatch(anchorPosition, hitToAnchor.transform);
            grapplingHook.DistanceJoint.distance = Vector2.Distance(ownerPosition, hitToAnchor.point);
        }
        else if (hook.Anchors.Count > 1)
        {
            RaycastHit2D hitToPreviousAnchor = Physics2D.Linecast(ownerPosition, hook.Anchors[1].position, hook.RopeRaycastLayerMask);
            if (hitToPreviousAnchor.collider == null)
            {
                grapplingHook.DistanceJoint.distance = Vector2.Distance(ownerPosition, hook.Anchors[0].position) + Vector2.Distance(hook.Anchors[0].position, hook.Anchors[1].position);
                hook.DestroyAnchorAt(0);
            }
        }

        grapplingHook.DistanceJoint.connectedAnchor = hook.Anchors[0].position;
    }