The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
                               Set::Relation
---------------------------------------------------------------------------

2009-04-21   Darren Duncan <perl@DarrenDuncan.net>

    * Set::Relation version 0.10.0 for Perl 5 is released on CPAN as
    Set-Relation-0.10.0.tar.gz.

    * Updated external dependencies: namespace::clean to version 0.11,
    Moose/etc to version 0.75, Class::MOP to version 0.82.

    * This release features a number of functional method updates or
    additions in accordance with the latest Muldis D spec (v0.64.0).

    * (Relation.pm, V2.pm, V1.pm)  Added, to the Set::Relation role and its
    composing classes, 2 new functional methods
    "[rank|limit]_by_attr_names", which are like "rank|limit" but that
    rather than taking a closure function to determine relative ordering of
    each pair of tuples, it takes an array of attribute names to order by;
    the new methods are more specialized versions of the old ones, and are
    recommended for use where they are applicable.  It is significant to
    note that these are the first Set::Relation routines that make use of
    the implementation technique of generating and evaling Perl code to do
    the actual work, which allows us to unroll what would otherwise be
    loops iterating over the attributes being ordered by; this should
    further yield better performance; both V2 and V1 have done this.

    * (Relation.pm, V2.pm, V1.pm)  Changed the "summary" functional method
    by renaming its "result_attr_names" parameter to "summ_attr_names" and
    redefining its functionality more in terms of "extension" rather than
    "map"; the function given to "summ_func" must now just result in a
    tuple with attributes to add to a result which now already has all the
    attributes named by "group_per", rather than resulting in all
    attributes for the result.  The new version of "summary" should be much
    easier to use as presumably users always want to keep the attributes
    they are grouping per, and they now don't have to spell them out every
    time.  For the rare case where you want the old behaviour, now you have
    to do it manually with an explicit "cmpl_group" plus "map".

    * (Relation.pm, V2.pm, V1.pm)  Added, to the Set::Relation role and its
    composing classes, new functional method "cardinality_per_group" which
    is like "summary" but shorthands the common case where people just want
    a count of tuples per group and not any other information.

2009-03-24   Darren Duncan <perl@DarrenDuncan.net>

    * Set::Relation version 0.9.0 for Perl 5 is released on CPAN as
    Set-Relation-0.9.0.tar.gz.

    * (Relation.pm, V2.pm, V1.pm)  Added new functional method
    "classification" which is sort of a cross between "restriction" and
    "group"; it uses a Perl subroutine argument to partition a relation's
    tuples into an arbitrary number of groups.  It is named after Perl 6's
    "classify" operator, and is like List::MoreUtil's "part" function.

    * (Relation.pm)  Updated the Set::Relation role in several closely
    related ways.  Added new named parameter to 'new' named 'keys' which
    lets one define candidate keys for the new relation which the 'members'
    argument must satisfy for 'new' to succeed; a variety of format
    examples were included in the documentation.  Also updated the accessor
    method 'export_for_new' and added the accessor method 'keys' which take
    care of dumping the list of candidate keys that the relation object is
    known to satisfy.  Also added new functional method 'has_key' which
    tests whether the invocant relation has a certain candidate key; if it
    does, this method also has the side effect of remembering the fact for
    'keys' to return later.  It was also documented in a few places that
    these 'keys' are not constraints against future object mutations, and
    so they might be invalidated by 'insert' later for mutable objects.
    The ::Mutable role inherits all these changes.

    * (V2.pm)  Updated the Set::Relation::V2 class to implement the new
    features required by the above change item.  This is a fairly simple
    first draft of of the 'keys' feature and isn't very integrated yet, not
    any more than with V1; it currently doesn't have any positive impact on
    performance and it currently just provides an extra kind of constraint
    on new objects or an extra kind of validation on existing ones.

    * (V1.pm)  Updated the Set::Relation::V1 class to implement the new
    features required by the above change item.  The current implementation
    also is such that while 'insert' is smart enough to clear a candidate
    key iff it becomes violated, 'delete' will not restore or add any
    candidate key; you must invoke 'has_key' later to do that.  Also, like
    with indexes, all new relations derived from others such as by 'clone'
    or 'new' or relational operations will start out with no 'keys' for
    simplicity; presumably an upcoming V2 will be different.

2009-03-23   Darren Duncan <perl@DarrenDuncan.net>

    * Set::Relation version 0.8.0 for Perl 5 is released on CPAN as
    Set-Relation-0.8.0.tar.gz.

    * This release features the addition of a second bundled implementation
    of the Set::Relation role, called V2, which should have different (and
    hopefully better) performance characteristics than V1.  This release
    doesn't change the S::R public API in any particularly substantial way.

    * Updated external dependencies: Moose/etc to version 0.72, Class::MOP
    to version 0.78.

    * (Set_Relation_5[0_Synopsis|1_Database_in_Depth_Example].t,
    Relation.pm)  Updated the test suite and the SYNOPSIS docs and the
    'new' submethod docs to avoid the repetition of the
    Set::Relation-implementing class name by creating a one-liner-per-file
    wrapper function over 'new' named 'relation' which is now used for all
    methodless S::R object creation.

    * (Set_Relation_5[0_Synopsis|1_Database_in_Depth_Example].t)  Updated
    the test suite internals to make them more modular; in each test file,
    refactored all the actual tests into a subroutine, so the set can be
    defined once and reinvoked for each bundled Set::Relation-doing class,
    when more than one of those (others besides V1.pm) come to exist.

    * (Relation.pm)  Updated all 10 methods of the Set::Relation role that
    had a "Array|Str"-typed parameter named "[|\w+_]attrs" and renamed said
    parameter to "[|\w+_]attr_names"; any similarly named parameters that
    were of some other type, such as "Hash", kept their old names.  This
    change should make the parameters more self-documenting, since "attrs"
    names now tend to have both attribute names and values, where as
    "attr_names" have just names.  The changed 10 methods were: "slice",
    "has_attrs", "[|cmpl_]projection", "extension", "map", "summary",
    "substitution", "subst_in_[restr|semijoin]".  Note that, since all of
    the methods' parameters are positional (rather than named), the change
    is completely backwards compatible.

    * (V1.pm)  Updated the Set::Relation::V1 class to rename some of its
    public method parameters as per the previous change item.

    * (Relation.pm)  Added new performance-enhancing feature to the
    Set::Relation role, in the form of a new optional boolean parameter
    "allow_dup_tuples" for each of 17 methods.  Each Set::Relation-doing
    class has the option of honoring a true argument for that parameter by
    avoiding work involved in eliminating duplicate tuples and thereby
    having possibly different results or side-effects on said method
    invocations, due to what are partially multiset semantics being used
    instead of set semantics.  So users can explicitly request, on a
    case-by-case basis, to get possibly less accurate but "good enough"
    results in exchange for better performance.  Also added new
    documentation sub-section "Matters of Correctness" under the
    DESCRIPTION main section, that explains the feature.  The changed 17
    methods were: "export_for_new", "members", "body", "slice", "attr",
    "cardinality", "[|cmpl_]restriction", "restriction_and_cmpl",
    "extension", "map", "summary", "substitution"
    "[|static_]subst_in_restr", "subst_in_semijoin",
    "outer_join_with_exten".

    * (V1.pm)  Updated the Set::Relation::V1 class to add some public
    method parameters as per the previous change item.  However, this
    change is a no-op since the parameters are ignored in every case, with
    the semantics being the same as if they were never given arguments.

    * (Relation.pm, V1.pm)  Various other small updates and fixes.

    * Added new file lib/Set/Relation/V2.pm which is now the bundled second
    implementation of the Set::Relation role, and updated all the other
    relevant distribution files concerning it.  The new V2.pm initially
    started as a clone of V1.pm following all of the above change items,
    and then differentiated in 2 main ways:  The first is that V2 provides
    immutable objects (doesn't do ::Mutable) while V1 provides mutable
    objects.  The second is that V2 is lazy and will defer any tests for
    duplicate tuples as late as possible, while V1 is eager and will test
    for duplicate tuples as early as possible; V2 will also respect true
    "allow_dup_tuples" arguments, while V1 will ignore them.  Besides those
    2 matters and their associated large differences in performance
    profiles, V2 is essentially the same as V1, including that relation
    tuples are internally represented by Perl Hashes.  Also V2 just has a
    short DESCRIPTION pod section to start out, while V1's is longer.

2009-02-13   Darren Duncan <perl@DarrenDuncan.net>

    * Set::Relation version 0.7.0 for Perl 5 is released on CPAN as
    Set-Relation-0.7.0.tar.gz.

    * Updated external dependencies: Moose/etc to version 0.69.

    * Split up Relation.pm into itself and the new file
    lib/Set/Relation/V1.pm; Relation.pm now declares a role rather than a
    class, and V1.pm is a class doing that role.  Relation.pm now declares
    the Set::Relation API and keeps nearly all the old module
    documentation, and V1.pm has nearly all of the old code.  Moreover,
    Relation.pm now declares not one but 2 roles, Set::Relation and
    Set::Relation::Mutable, where the latter consumes the former and
    Set::Relation::V1 consumes the latter; the former role promises that
    its composing class' objects are immutable unless they also compose the
    latter.  The ::Mutable role got the 6 public methods ['clone',
    'has_frozen_identity', 'freeze_identity', 'evacuate', 'insert',
    'delete'] plus the 'has_frozen_identity' optional parameter of the
    'new' constructor, and the parent role got all the other public things.
    Also updated the test suite, and the SYNOPSIS pod, to account for this
    split, and they now invoke the ::V1 class directly rather than the
    shorter package name that is now a role.  The new class has exactly the
    same API as the old class.

    * Updated the TODO file to outline plans for a near future ::V2 class
    which represents tuples using Perl Array rather than Perl Hash.

2009-02-09   Darren Duncan <perl@DarrenDuncan.net>

    * Set::Relation version 0.6.0 for Perl 5 is released on CPAN as
    Set-Relation-0.6.0.tar.gz.

    * As of this release, Set::Relation for Perl 5 directly uses the
    List::MoreUtils module to handle some of its detail work; this
    distribution has now gained a direct external dependency on the Perl 5
    module 'List::MoreUtils', which is not bundled with any version of Perl
    and will need to be installed from CPAN.  That said, List::MoreUtils
    was already a dependency of Set::Relation's existing Moose dependency,
    so the whole dependency tree has not enlarged.

    * (Relation.pm)  Added these 14 object methods: "wrap", "cmpl_wrap",
    "unwrap", "group", "cmpl_group", "ungroup", "summary",
    "join_with_group", "rank", "limit", "outer_join_with_group",
    "outer_join_with_undefs", "outer_join_with_static_exten",
    "outer_join_with_exten".  As of now, all of the pre-documented and
    TODO-marked object methods have been implemented.

    * (Relation.pm)  Replaced all instances of "__PACKAGE__->new(...)" with
    "$self->new(...)" etc, to help avoid potential future problems when
    someone tries to subclass the module.

    * (Relation.pm)  Various bug fixes and other small changes.

    * As of this release, Set::Relation is officially in alpha development
    status (was pre-alpha).  All of the initially planned functionality is
    now implemented, so it is feature complete, which is why it was moved
    out of pre-alpha status.  However most of the functionality has not
    been tested and so is not proven to actually work without error.  Once
    the module has a thorough test suite which passes, Set::Relation can be
    moved to beta or released status.

2009-02-09   Darren Duncan <perl@DarrenDuncan.net>

    Record update in the PAUSE modules database:

           modid: [Set::Relation]
           statd: [a] was [c]
           stats: [m]
           statl: [p]
           stati: [O]
           statp: [l]
     description: [Relation data type for Perl]
          userid: [DUNCAND]
       chapterid: [6]
        mlstatus: [list]

2009-02-06   Darren Duncan <perl@DarrenDuncan.net>

    * Set::Relation version 0.5.0 for Perl 5 is released on CPAN as
    Set-Relation-0.5.0.tar.gz.

    * (Relation.pm)  Added these 8 object methods (still 14 to go):
    "restriction_and_cmpl", "semijoin_and_diff", "substitution",
    "static_substitution", "subst_in_restr", "static_subst_in_restr",
    "subst_in_semijoin", "static_subst_in_semijoin".

    * (Relation.pm)  Other minor updates and fixes.

2009-02-05   Darren Duncan <perl@DarrenDuncan.net>

    * Set::Relation version 0.4.0 for Perl 5 is released on CPAN as
    Set-Relation-0.4.0.tar.gz.

    * Updated external dependencies: Moose/etc to version 0.68.

    * As of this release, Set::Relation for Perl 5 uses the
    namespace::clean pragma for good hygiene; this distribution has now
    gained an external dependency on the Perl 5 module 'namespace::clean',
    which is not bundled with any version of Perl and will need to be
    installed from CPAN; namespace::clean also has a few not-bundled
    dependencies of its own.

    * (Relation.pm)  Added "use namespace::clean" statements inside the
    package declaration following any other "use" statements, so their
    exports into our package doesn't also become part of our own public API
    as a side-effect; the only exception is the "meta" method that Moose
    adds, which is kept.

    * (Relation.pm)  Added new documentation sub-section under
    "DESCRIPTION" named "Appropriate Uses For Set::Relation", which should
    hopefully answer some FAQs, such as why does the module exist, and
    pointing out some strengths and weaknesses.

    * (Relation.pm)  Corrected a forgetful oversight in the module
    documentation concerning Set::Relation's "has_frozen_identity" object
    attribute; this attribute had an auto-generated read-only public
    accessor method plus is automatically initialized from a same-named
    constructor method; added "has_frozen_identity" to the accessor method
    list, and updated the "new" constructor submethod signature.

    * (Relation.pm, Set_Relation_50_Synopsis.t,
    Set_Relation_51_Database_in_Depth_Example.t)  Updated the "new"
    constructor submethod so that it now accepts a single positional
    argument as an invocation option, where before it just accepted named
    arguments (and it still does); a single positional argument to "new" is
    treated the same as a single "members" named argument.  This change
    means that the majority of current or anticipated future use cases of
    Set::Relation are now terser by about 9-11 characters ("members => ")
    per "new" invocation.  (This new feature was implemented mainly by
    adding a simple BUILDARGS method to Relation.pm.)  Updated all the
    examples and tests to use the new terser format.

    * (Relation.pm)  As a consequence of the previous change, the "new"
    constructor has also been updated so that the "members" argument is no
    longer allowed to be a Perl Hash (because a lone Hash positional
    argument is one of the standard Moose format options to supply named
    arguments) so any invocations of "new" which gave a Hash argument will
    have to become 2 characters ("[]") more verbose, wrapping it in an
    Array.  Removed the example using a Hash.

    * (Relation.pm)  Added the Moose concerning recommended practice
    "__PACKAGE__->meta()->make_immutable();" line to the end of the module,
    which should help performance regarding Moose-generated stuff; this
    would've been done before release 0.0.0 but was forgotten at the time.

    * (Relation.pm)  Updated the "LICENSE AND COPYRIGHT" documentation
    section to change the Copyright declaration from "Darren Duncan" to
    "Muldis Data Systems, Inc." (which is wholly owned by Darren Duncan).

2009-02-02   Darren Duncan <perl@DarrenDuncan.net>

    * Set::Relation version 0.3.0 for Perl 5 is released on CPAN as
    Set-Relation-0.3.0.tar.gz.

    * (Relation.pm)  Added these 5 object methods (still 20 to go):
    "slice", "attr", "has_attrs", "attr_names", "transitive_closure".

    * (Relation.pm)  Other minor updates and fixes.

2009-02-01   Darren Duncan <perl@DarrenDuncan.net>

    * Set::Relation version 0.2.0 for Perl 5 is released on CPAN as
    Set-Relation-0.2.0.tar.gz.

    * (Relation.pm)  Added full documentation for the remaining 25 object
    methods that Set::Relation expects to have implemented prior to being
    moved to alpha development status; each is marked TODO in its title;
    this change item doesn't have a list of said methods, but when they are
    implemented in the next 1-3 releases, the change log will mention them
    simply as being new, same as if they hadn't been pre-documented now
    (and the TODO marker on their docs will be silently removed).

    * (Relation.pm)  Added placeholder code for said 25 TODO methods, each
    of which will die with an "unimplemented" message if invoked.

    * (Relation.pm)  Other minor code updates.

2009-01-31   Darren Duncan <perl@DarrenDuncan.net>

    * Set::Relation version 0.1.0 for Perl 5 is released on CPAN as
    Set-Relation-0.1.0.tar.gz.

    * This release features a few API changes, some significant feature
    additions, and bug fixes to existing routines, but no public facing
    routines have been added or removed.  New routines should feature in
    the next 0.Y.0 release.

    * (Relation.pm)  Updated each of the 5 functional methods ["union",
    "exclusion", "intersection", "join", "product"] so it is now an N-adic
    operator rather than a dyadic operator.  Each method's "other"
    parameter was renamed to "others" and now takes either a single
    Set::Relation object as before or an Array of 0..N Set::Relation
    objects which is new.  With this change, these operators are now at
    feature parity with the Muldis D functions they are based on, except
    that they never handle the niladic option; being object methods, there
    is always at least one operand which is the invocant.

    * (Relation.pm)  Updated each of the 4 functional methods
    ["[|cmpl_]restriction", "extension", "map"] to remove its optional
    "assuming" parameter.  This parameter was a fossil left over from the
    original Muldis D versions of these operators that the Perl version was
    ported from; the parameter was necessary in Muldis D to have reasonable
    flexibility due to Muldis D lacking certain other features that Perl
    has, which make this parameter unnecessary in Perl.  The removal was to
    keep the Perl simpler; it also sets the stage for the next change item.

    * (Relation.pm, Set_Relation_51_Database_in_Depth_Example.t)  Updated
    each of the 4 functional methods ["[|cmpl_]restriction", "extension",
    "map"] so that the Perl routine supplied as its "func" argument is now
    assumed to have zero parameters rather than one, and the Perl routine
    is now supplied its input tuple/Hash in $_, same as how Perl's built-in
    map/grep operators work, rather than as a first/only argument.  Thanks
    to Todd Hepler for proposing that design change to "restriction" to
    make it more DWIM.

    * (Relation.pm, Set_Relation_51_Database_in_Depth_Example.t)  Updated
    each of the 4 functional methods ["[|cmpl_]projection", "extension",
    "map"] so that the "[|result_]attrs" parameter can also take a Str
    argument rather than just an Array of Str argument.  Thanks to Todd
    Hepler for proposing that design change to "projection" to make it more
    DWIM.  Also updated the Set::Relation constructor submethod similarly,
    so its "members" parameter may also take a Str argument; this would
    produce a relation object with 1 attribute and zero tuples.

    * (Relation.pm)  Fixed an "insert" mutator method bug so it detects
    and blocks attempts to insert the invocant Set::Relation object into
    itself as a value-typed component, which would have had the side-effect
    of freezing the invocant, or would have conceptually been an infinite
    recursive deep copy operation; also fixed the "delete" mutator with
    the same detector since it would have had the same freezing problem.

    * (Relation.pm)  Updated all routines that take tuple-representing Hash
    values from the user, either directly or as tuple-valued attrs, either
    as a routine argument or a closure return value, so that each Hash is
    tested for circular references between itself or its value-typed
    components; this update fixes a general bug where the module could
    infinitely recurse when processing that input, since tuple-representing
    input from the user is deep-copied.

    * (Relation.pm)  Some POD reformatting:  Took what used to be the 5
    level-2 headings under the INTERFACE level-1 heading and changed said 5
    into level-1 headings, but did not uppercase their text.  Then
    converted the routine lists from being "=over/=item <routine>/=back" to
    each routine having its own level-2 heading.  For each routine, the new
    heading is just the short name of the routine, and the full signature
    of the routine displays just as its own paragraph.  All these changes
    combined should look visually like we are faking 3 levels of headings,
    with top and middle being upcased and mixed case "=head1" respectively.

    * (Relation.pm)  Minor code and POD updates and fixes.

2009-01-26   Darren Duncan <perl@DarrenDuncan.net>

    * Set::Relation version 0.0.2 for Perl 5 is released on CPAN as
    Set-Relation-0.0.2.tar.gz.

    * (Relation.pm)  Fixed two instances of a bug in the "rename" method.
    Thanks to Todd Hepler for spotting the bug and providing a patch.

    * Added new test file "t/Set_Relation_51_Database_in_Depth_Example.t",
    which exercises more than a half-dozen Set::Relation methods that
    previously had no tests; the "rename" bugs were exposed when writing
    this.  Thanks to Todd Hepler who authored and contributed this file.

    * This distribution has gained a new direct external dependency on the
    Test::Deep module, which currently is only used by the new test file.

    * (Relation.pm)  Minor code comment fixes and POD updates.

2009-01-21   Darren Duncan <perl@DarrenDuncan.net>

    * Set::Relation version 0.0.1 for Perl 5 is released on CPAN as
    Set-Relation-0.0.1.tar.gz.

    * (Relation.pm)  Fixed a bug in the "quotient" method, and further
    updated it with some special-case shortcuts.

    * (Relation.pm)  Other minor updates.

    * (README, Relation.pm)  Previously the FORUMS pod section of
    Relation.pm and 3 parts of the README file lacked content, and now they
    have it; added documentation about where the Set::Relation version
    control and support forums are.

2009-01-19   Darren Duncan <perl@DarrenDuncan.net>

    * Set::Relation version 0.0.0 for Perl 5 is released on CPAN as
    Set-Relation-0.0.0.tar.gz.

    * It constitutes a rewrite of Set::Relation for Perl 6 that had been
    made in 2006 but was never functional; the large body of work going
    into the Muldis D language and Muldis Rosetta framework during the
    intervening period also fed into this new Set::Relation module; it is
    expected that this new Set::Relation for Perl 5 will be ported to Perl
    6 in the near future and so upgrade that 2006 version; meanwhile, this
    Changes entry refers only to the Perl 5 version.

    * This is the first release of the Perl 5 Set::Relation distribution,
    and the first release of any distribution to contain a Perl 5 module
    named Set::Relation.

    * This is the initial file manifest:

        Changes
        INSTALL
        lib/Set/Relation.pm
        LICENSE/GPL
        LICENSE/LGPL
        Makefile.PL
        MANIFEST
        MANIFEST.SKIP
        README
        t/Set_Relation_00_Compile.t
        t/Set_Relation_50_Synopsis.t
        TODO

    * As of this release, Set::Relation is officially in pre-alpha
    development status.

    * This is the initial complement of routines; besides the "new"
    constructor submethod, there are these 40 object methods: "clone",
    "export_for_new", "freeze_identity", "which", "members", "heading",
    "body", "evacuate", "insert", "delete", "degree", "is_nullary",
    "cardinality", "is_empty", "is_member", "empty", "insertion",
    "deletion", "rename", "projection", "cmpl_projection", "restriction",
    "cmpl_restriction", "extension", "static_extension", "map",
    "is_identical", "is_subset", "is_proper_subset", "is_disjoint",
    "union", "exclusion", "intersection", "difference", "semidifference",
    "semijoin", "join", "product", "quotient", "composition".

2009-01-04   Darren Duncan <perl@DarrenDuncan.net>

    The next version of the Module List will list the following module:

      modid:       Set::Relation
      DSLIP:       cmpOl
      description: Relation data type for Perl
      userid:      DUNCAND (Darren Duncan)
      chapterid:   6 (Data_Type_Utilities)
      enteredby:   BDFOY (brian d foy)
      enteredon:   Mon Jan  5 06:12:12 2009 GMT

    The resulting entry will be:

    Set::
    ::Relation   cmpOl Relation data type for Perl                  DUNCAND

2006-04-14 thru 2006-11-22

    * A Perl 6 project named "Relation" is started (complementary to the
    earlier existing to-be-named Muldis Rosetta project) which was intended
    to provide native tuple and relation data types for ordinary use in
    Perl 6 programs like other built-in collection types.  The first commit
    was Pugs SVN rev 9938, on 2006-04-14, and Pugs 6.2.12 (2006-06-26)
    included it.  Hence 2006 is the start of the declared copyright date
    range for Set::Relation.

    * On 2006-07-04, renamed this Perl 6 project to "Set-Relation", which
    it remains to this day.  Pugs 6.2.13 and later included this.

    * The Perl 6 Set-Relation received various small updates thru
    2007-02-03 (Pugs SVN rev 15168), but is now stagnant; it will likely
    get un-stuck after the initially newer Perl 5 version is made to work.

2005-12-05

    * Darren Duncan is introduced by David Wheeler to the truly relational
    model of data, in a posting on the Bricolage development list in the
    "Re: [6977] New branch for maintenance of Bricolage 1.10.x." thread.

    * David said that Darren's expressed thought, that compound data types
    in table fields was a violation of first normal form, was in fact a
    misconception about the relational model.  David then referenced a
    recent interview with C. J. Date.

    * This set off a chain of events which was the largest paradigm shift
    to ever affect what evolved into the Muldis Rosetta project, and also
    resulted in the genesis of the Set::Relation module.