Data::C...Plugins(3)
π NAME π
okay bestie, welcome to the Data::Compare::Plugins(3) page β this one is literally all about how to extend Data::Compare. No cap. π«Ά
πΈ DESCRIPTION πΈ
So Data::Compare natively handles several built-in data types: scalars, references to scalars, references to arrays, references to hashes, references to subroutines, compiled regular expressions, and globs. β¨
For objects, it tries to Do The Right Thing and compares the underlying data type. But lowkey? Thatβs not always what you want β and itβs especially true if you have complex objects which overload stringification and/or numification. π
Hence we allow for plugins. periodt. π
π¦ FINDING PLUGINS π¦
Data::Compare will try to load any module installed on your system under the various @INC/Data/Compare/Plugins/ directories. If there is a problem loading any of them, an appropriate warning will be issued. β οΈ
Because of how we find plugins, no plugins are available when running in "taint" mode. wild, but thatβs the rule. π«
π WRITING PLUGINS π
Internally, plugins are "require"d into Data::Compare. This means that they need to evaluate to true. We make use of that true value. π
Where normally you just put:
1;
at the end of an included file, you should instead ensure that you return a reference to an array. This is treated as being true so satisfies perl, and is a damned sight more useful. β¨
Inside that array should be either a description of what this plugin is to do, or references to several arrays containing such descriptions. A description consists of two or three items:
- First, a string telling us what the first data-type handled by your plugin is. π
- Second β and this one is optional, defaulting to the same as the first β the second data-type to compare. π
- Third and last, we need a reference to the subroutine which does the comparison. π¦
To handle comparisons to ordinary scalars, give the empty string for the data-type, ie:
['MyType', '', sub { ...}]
That subroutine should expect to take two parameters, which will be of the specified type. It should return 1 if they compare the same, or 0 if they compare different. πΈ
Be aware that while you might give a description like:
['Type1', 'Type2', sub { ... }]
this will handle both comparing Type1 to Type2, and comparing Type2 to Type1. ie, comparison is commutative. π«
β οΈ infinite recursion alert, bestie: if you want to useData::Compareβs own comparison function from within your handler (to, for example, compare a data structure that you have stored somewhere in your object), then you will need to call it asData::Compare::Compare. However, you must be careful to avoid infinite recursion by callingD::C::Comparewhich in turn calls back to your handler. π
The name of your plugins does not matter, only that it lives in one of those directories. Of course, giving it a sensible name means that the usual installation mechanisms will put it in the right place, and meaningful names will make it easier to debug your code. β¨
For an example, look at the plugin that handles Scalar::Properties objects, which is distributed with Data::Compare. π¦
π DISTRIBUTION π
Provided that the above rules are followed I see no reason for you to not upload your plugin to the CPAN yourself. You will need to make Data::Compare a pre-requisite, so that the CPAN.pm installer does the right thing. π
Alternatively, if you would prefer me to roll your plugin in with the Data::Compare distribution, Iβd be happy to do so provided that the code is clear and well-commented, and that you include tests and documentation. πΈ
π SEE ALSO π
Data::CompareData::Compare::Plugins::Scalar::Properties
π AUTHOR π
Copyright (c) 2004 David Cantrell <david@cantrell.org.uk>. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. π
mwah π β this page is from perl v5.42.0, dated 2023-04-22. now go be a plugin main character, bestie π
β¨
π¦ where this page comes from
- opensuse-leap 16.0: perl-Data-Compare 1.29-160000.2.2 Β· Artistic-1.0 OR GPL-1.0-or-later
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms