On Mar 12, 2010, at 10:16 AM, Marvin Humphrey wrote:
I'd been thinking that "KinoSearch" would have a perpetually unstable API, and that we'd abandon all pretense that it would ever be stable. However, we could do as you say here and break API compatibility only at major release points -- however, to avoid abandoning the earlier user base completely, we'd
spin off a renamed stable branch at each back-compat break.

If we did that, CPAN would look like this right away:

  KinoSearch1 1.00    <-- branches/ks1
KinoSearch 1.00 <-- identical to branches/ks1 except for namespace
  KinoSearch  3.00_01 <-- trunk

We would then work to get trunk ready for a real version 3 release. Once it
was published, CPAN would look like this:

  KinoSearch1 1.00    <-- branches/ks1
  KinoSearch  3.00    <-- branches/maint-3.x
  KinoSearch  4.00_01 <-- trunk

Then, in a year or so[2] when we release KinoSearch 4, CPAN would look like
this:

  KinoSearch1 1.00    <-- branches/ks1
  KinoSearch3 3.00    <-- branches/ks3
  KinoSearch  4.00    <-- branches/maint-4.x
  KinoSearch  5.00_01 <-- trunk

One of the problems with this approach is that, if I want to use KinoSearch 4.00 stable, I would have to start with ‘KinoSearch’ and later migrate my code to ‘KinoSearch4’.

Another problem with the all the multiple namespace suggestions so far is that it makes it hard for KSx:: authors. How would I write a KSx:: module that works with multiple KinoSearch versions? Would I have to keep releasing a new KS3x:: or KS4x:: whenever there is a new KinoSearch release?

I have a suggestion, which I think would make it much easier for script authors, and a little easier for module authors:

Perhaps the ‘KinoSearch’ namespace could be a front end that delegates to a separate namespace. So ‘use KinoSearch 3;’ or ‘use KinoSearch api => 3’ would alias all the KinoSearch namespaces to KinoSearch3:: or KinoSearch::3:: for that process (or thread). Then a KSx module can call KinoSearch->api or api_version (perhaps this method could be on every object under KinoSearch::) to find out which version is being used. If a process needs to access multiple KinoSearch versions, it can use KinoSearch3 directly.

Using KinoSearch without specifying a version will default to the latest, with a warning. ‘api => "*"’, ‘api => 0’ or ‘api => "latest"’ could be used to suppress the warning.

Now, for this to work seamlessly, all KinoSearch versions would have to be bundled along with the latest, which is a bit much. I think clear documentation that explains that KinoSearch2/3 needs to be installed separately (if it is an old version) is a sufficient compromise, as the ‘Can’t locate KinoSearch2.pm in @INC’ message explains exactly what’s wrong.


Right now I’m having a maintenance nightmare, as two separate websites are using different versions of KinoSearch that are no longer on CPAN. And I haven’t had time to update the code for either of them.... And I need to update my KSx modules, too. I’m just looking for a way to make this all much easier.

Father Chrysostomos

Reply via email to