NAME
    Class::Accessor::PackedString::Set - Like Class::Accessor::PackedString,
    but store attributes as they are set

VERSION
    This document describes version 0.001 of
    Class::Accessor::PackedString::Set (from Perl distribution
    Class-Accessor-PackedString-Set), released on 2017-10-15.

SYNOPSIS
    In lib/Your/Class.pm:

     package Your::Class;
     use Class::Accessor::PackedString::Set {
         # constructor => 'new',
         accessors => [
             foo => "f",
             bar => "c",
         ],
     };

    In code that uses your class:

     use Your::Class;

     my $obj = Your::Class->new;

    $obj is now:

     bless(do{\(my $o = "")}, "Your::Class")

    After:

     $obj->bar(34);

    $obj is now:

     bless(do{\(my $o = join("", chr(1), pack("c", 34)))}, "Your::Class")

    After:

     $obj->foo(1.2);

    $obj is now:

     bless(do{\(my $o = join("", chr(1), pack("c", 34), chr(0), pack("f", 1.2)))}, "Your::Class")

    After:

     $obj->bar(undef);

    $obj is now:

     bless(do{\(my $o = join("", chr(0), pack("f", 1.2)))}, "Your::Class")

    To subclass, in lib/Your/Subclass.pm:

     package Your::Subclass;
     use parent 'Your::Class';
     use Class::Accessor::PackedString::Set {
         accessors => [
             @Your::Class::HAS_PACKED,
             baz => "a8",
             qux => "a8",
         ],
     };

DESCRIPTION
    This module is a builder for classes that use string as memory storage
    backend. The string is initially empty when there are no attributes set.
    When an attribute is set, string will be appended with this data:

     | size        | description                        |
     +-------------+------------------------------------+
     | 1 byte      | index of attribute                 |
     | (pack size) | attribute value, encoded by pack() |

    When another attribute is set, string will be further appended. When an
    attribute is unset (undef'd), its entry will be removed in the string.

    This module is similar to Class::Accessor::PackedString. Using string
    (of pack()-ed data) is useful in situations where you need to create
    many (e.g. thousands+) objects in memory and want to reduce memory
    usage, because string-based objects are more space-efficient than the
    commonly used hash-based objects. Unlike in
    Class::Accessor::PackedString, space is further saved by only storing
    set attributes and not unset attributes. This particularly saves
    significant space if you happen to have many attributes with usually
    only a few of them set.

    The downsides are: 1) you have to predeclare all the attributes of your
    class along with their types (pack() templates); 2) you can only store
    data which can be pack()-ed; 3) slower speed, because unpack()-ing and
    re-pack()-ing are done everytime an attribute is accessed or set.

    Caveats:

    There is a maximum of 256 attributes.

HOMEPAGE
    Please visit the project's homepage at
    <https://metacpan.org/release/Class-Accessor-PackedString-Set>.

SOURCE
    Source repository is at
    <https://github.com/perlancar/perl-Class-Accessor-PackedString-Set>.

BUGS
    Please report any bugs or feature requests on the bugtracker website
    <https://rt.cpan.org/Public/Dist/Display.html?Name=Class-Accessor-Packed
    String-Set>

    When submitting a bug or request, please include a test-file or a patch
    to an existing test-file that illustrates the bug or desired feature.

SEE ALSO
    Class::Accessor::PackedString

AUTHOR
    perlancar <perlancar@cpan.org>

COPYRIGHT AND LICENSE
    This software is copyright (c) 2017 by perlancar@cpan.org.

    This is free software; you can redistribute it and/or modify it under
    the same terms as the Perl 5 programming language system itself.

