diff --git a/src/Hook/ViewsSortLengthHooks.php b/src/Hook/ViewsSortLengthHooks.php
new file mode 100644
index 0000000..cb97dc5
--- /dev/null
+++ b/src/Hook/ViewsSortLengthHooks.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace Drupal\views_sort_length\Hook;
+
+use Drupal\Component\Utility\NestedArray;
+use Drupal\Component\Utility\DeprecationHelper;
+use Drupal\Core\Hook\Attribute\Hook;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Hook implementations for views_sort_length.
+ */
+class ViewsSortLengthHooks {
+  use StringTranslationTrait;
+
+  /**
+   * Implements hook_help().
+   */
+  #[Hook('help')]
+  public function help($route_name) {
+    switch ($route_name) {
+      case 'help.page.views_sort_length':
+        $output = '';
+        $output .= '<h3>' . $this->t('About') . '</h3>';
+        $output .= '<p>' . $this->t('The Views Sort Length module adds a sorting field for every views field.') . '</p>';
+        $output .= '<h3>' . $this->t('Uses') . '</h3>';
+        $output .= '<dl>';
+        $output .= '<dt>' . $this->t('Add views sorting field') . '</dt>';
+        $output .= '<dd>' . $this->t('A sorting field will now be available for every views field. Use the field to sort by the length of the data in that field.') . '</dd>';
+        $output .= '</dl>';
+        return $output;
+    }
+  }
+
+  /**
+   * Implements hook_views_data().
+   *
+   * @see views_views_data()
+   * @noinspection PhpUnused
+   */
+  #[Hook('views_data')]
+  public function viewsData(): array {
+    $data = [];
+    $entity_type_manager = \Drupal::entityTypeManager();
+    if ($entity_type_manager->hasDefinition('field_storage_config')) {
+      /** @var \Drupal\field\FieldStorageConfigInterface $field_storage */
+      foreach ($entity_type_manager->getStorage('field_storage_config')->loadMultiple() as $field_storage) {
+        if (DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::service('views.field_data_provider')->getSqlStorageForField($field_storage), fn() => _views_field_get_entity_type_storage($field_storage))) {
+          // Add new sort for every field that already has a sort.
+          $data = NestedArray::mergeDeep($data, _views_sort_length_get_sort_data(DeprecationHelper::backwardsCompatibleCall(\Drupal::VERSION, '11.2.0', fn() => \Drupal::service('views.field_data_provider')->defaultFieldImplementation($field_storage), fn() => views_field_default_views_data($field_storage))));
+        }
+      }
+    }
+    foreach (\Drupal::entityTypeManager()->getDefinitions() as $entity_type_id => $entity_type) {
+      if ($entity_type->hasHandlerClass('views_data')) {
+        /** @var \Drupal\views\EntityViewsDataInterface $views_data */
+        $views_data = \Drupal::entityTypeManager()->getHandler($entity_type_id, 'views_data');
+        // Add new sort for every property that already has a sort.
+        $data = NestedArray::mergeDeep($data, _views_sort_length_get_sort_data($views_data->getViewsData()));
+      }
+    }
+    return $data;
+  }
+
+}
diff --git a/views_sort_length.info.yml b/views_sort_length.info.yml
index 69505cc..97aa31d 100644
--- a/views_sort_length.info.yml
+++ b/views_sort_length.info.yml
@@ -1,4 +1,4 @@
 name: Views sort by length
 type: module
 description: Provides sort by length option in views.
-core_version_requirement: ^9 || ^10 || ^11
+core_version_requirement: ^11.2 || ^12
diff --git a/views_sort_length.module b/views_sort_length.module
index dfd0377..260252e 100644
--- a/views_sort_length.module
+++ b/views_sort_length.module
@@ -5,24 +5,15 @@
  * Basic functions for this module.
  */
 
-use Drupal\Component\Utility\NestedArray;
+use Drupal\Core\Hook\Attribute\LegacyHook;
+use Drupal\views_sort_length\Hook\ViewsSortLengthHooks;
 
 /**
  * Implements hook_help().
  */
+#[LegacyHook]
 function views_sort_length_help($route_name) {
-  switch ($route_name) {
-    case 'help.page.views_sort_length':
-      $output = '';
-      $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Views Sort Length module adds a sorting field for every views field.') . '</p>';
-      $output .= '<h3>' . t('Uses') . '</h3>';
-      $output .= '<dl>';
-      $output .= '<dt>' . t('Add views sorting field') . '</dt>';
-      $output .= '<dd>' . t('A sorting field will now be available for every views field. Use the field to sort by the length of the data in that field.') . '</dd>';
-      $output .= '</dl>';
-      return $output;
-  }
+  return \Drupal::service(ViewsSortLengthHooks::class)->help($route_name);
 }
 
 /**
@@ -61,32 +52,7 @@ function _views_sort_length_get_sort_data(array $baseData): array {
  * @see views_views_data()
  * @noinspection PhpUnused
  */
+#[LegacyHook]
 function views_sort_length_views_data(): array {
-  $data = [];
-
-  $entity_type_manager = Drupal::entityTypeManager();
-  if ($entity_type_manager->hasDefinition('field_storage_config')) {
-    /** @var \Drupal\field\FieldStorageConfigInterface $field_storage */
-    foreach ($entity_type_manager->getStorage('field_storage_config')
-      ->loadMultiple() as $field_storage) {
-      if (_views_field_get_entity_type_storage($field_storage)) {
-        // Add new sort for every field that already has a sort.
-        $data = NestedArray::mergeDeep($data, _views_sort_length_get_sort_data(views_field_default_views_data($field_storage)));
-      }
-    }
-  }
-
-  foreach (Drupal::entityTypeManager()
-    ->getDefinitions() as $entity_type_id => $entity_type) {
-    if ($entity_type->hasHandlerClass('views_data')) {
-      /** @var \Drupal\views\EntityViewsDataInterface $views_data */
-      $views_data = Drupal::entityTypeManager()
-        ->getHandler($entity_type_id, 'views_data');
-
-      // Add new sort for every property that already has a sort.
-      $data = NestedArray::mergeDeep($data, _views_sort_length_get_sort_data($views_data->getViewsData()));
-    }
-  }
-
-  return $data;
+  return \Drupal::service(ViewsSortLengthHooks::class)->viewsData();
 }
diff --git a/views_sort_length.services.yml b/views_sort_length.services.yml
new file mode 100644
index 0000000..343c08b
--- /dev/null
+++ b/views_sort_length.services.yml
@@ -0,0 +1,5 @@
+
+services:
+  Drupal\views_sort_length\Hook\ViewsSortLengthHooks:
+    class: Drupal\views_sort_length\Hook\ViewsSortLengthHooks
+    autowire: true
