| Summary: | Update Koha::Object(s) to allow for polymorphic classing | ||
|---|---|---|---|
| Product: | Koha | Reporter: | Martin Renvoize (ashimema) <martin.renvoize> |
| Component: | Architecture, internals, and plumbing | Assignee: | Martin Renvoize (ashimema) <martin.renvoize> |
| Status: | RESOLVED FIXED | QA Contact: | Tomás Cohen Arazi (tcohen) <tomascohen> |
| Severity: | enhancement | ||
| Priority: | P5 - low | CC: | david, dcook, Laura.escamilla, lucas, paul.derscheid, tomascohen |
| Version: | unspecified | ||
| Hardware: | All | ||
| OS: | All | ||
| GIT URL: | Initiative type: | --- | |
| Sponsorship status: | --- | Comma delimited list of Sponsors: | |
| Crowdfunding goal: | 0 | Patch complexity: | Small patch |
| Documentation contact: | Documentation submission: | ||
| Text to go in the release notes: |
Koha's object framework now supports polymorphic classing, allowing different object subclasses to be instantiated based on field values in shared database tables.
This enhancement updates `Koha::Object` and `Koha::Objects` classes to pass the original `DBIx::Class` result object to the `object_class` method, enabling dynamic class selection based on record content. This works across all standard retrieval methods including `find`, `find_or_create`, `single`, `next`, `last`, and `as_list`.
**Use cases:**
- Transport protocols (FTP/SFTP) sharing a common table but requiring protocol-specific methods
- Account lines where debits and credits share a table but need type-specific behaviour
- Any scenario where related object types share storage but require distinct method implementations
**For developers:**
To implement polymorphic classes, define a `_polymorphic_class_map` method in your `Koha::Objects` class that returns a hashref mapping field values to class names. The framework will automatically instantiate the appropriate subclass based on the stored data.
A template for implementing polymorphic classes is included in the codebase. Test::Builder has also been updated to introspect polymorphic class maps for comprehensive testing.
|
Version(s) released in: |
25.11.00
|
| Circulation function: | |||
| Bug Depends on: | |||
| Bug Blocks: | 39190 | ||
| Attachments: |
Bug 39488: Add $result to Koha::Objects `object_class` calls
Bug 39488: Add template for required polymorphic class methods Bug 39488: Use introspection in TestBuilder tests Bug 39488: Unit tests Bug 39488: Add $result to Koha::Objects `object_class` calls Bug 39488: Add template for required polymorphic class methods Bug 39488: Use introspection in TestBuilder tests Bug 39488: Unit tests Bug 39488: Add $result to Koha::Objects `object_class` calls Bug 39488: Add template for required polymorphic class methods Bug 39488: Use introspection in TestBuilder tests Bug 39488: Unit tests |
||
|
Description
Martin Renvoize (ashimema)
2025-03-31 09:22:49 UTC
Created attachment 179985 [details] [review] Bug 39488: Add $result to Koha::Objects `object_class` calls This allows us to do dynamic polymorphic classing on calls to 'find', 'find_or_create', 'single', 'next', 'last' and 'as_list' etc. Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 179986 [details] [review] Bug 39488: Add template for required polymorphic class methods Created attachment 179987 [details] [review] Bug 39488: Use introspection in TestBuilder tests We update the testbuilder tests here to look for signs of a polymorphic class map and use it to test the different class options for this base class Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Hmm, I'm struggling to come up with explicit tests for these changes. The main change here is that we consistently pass the original DBIx::Class row objects into the object_class meta method so that we can query the content to ascertain which polymorphpihc subclass to use for the subsequent _new_from_dbic calls. Created attachment 180189 [details] [review] Bug 39488: Unit tests Transferring Kyles SO from the bug this was split out from. Created attachment 185006 [details] [review] Bug 39488: Add $result to Koha::Objects `object_class` calls This allows us to do dynamic polymorphic classing on calls to 'find', 'find_or_create', 'single', 'next', 'last' and 'as_list' etc. Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 185007 [details] [review] Bug 39488: Add template for required polymorphic class methods Created attachment 185008 [details] [review] Bug 39488: Use introspection in TestBuilder tests We update the testbuilder tests here to look for signs of a polymorphic class map and use it to test the different class options for this base class Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 185009 [details] [review] Bug 39488: Unit tests Created attachment 185931 [details] [review] Bug 39488: Add $result to Koha::Objects `object_class` calls This allows us to do dynamic polymorphic classing on calls to 'find', 'find_or_create', 'single', 'next', 'last' and 'as_list' etc. Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Created attachment 185932 [details] [review] Bug 39488: Add template for required polymorphic class methods Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Created attachment 185933 [details] [review] Bug 39488: Use introspection in TestBuilder tests We update the testbuilder tests here to look for signs of a polymorphic class map and use it to test the different class options for this base class Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Created attachment 185934 [details] [review] Bug 39488: Unit tests Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Nice work everyone! Pushed to main for 25.11 Can you please add release notes? This is an enhancement and will not be backported to the 25.05.x branch. Architecture change, no UI changes, no changes required to the manual. |