1package Hash::Util::FieldHash; 2 3use 5.009004; 4use strict; 5use warnings; 6use Scalar::Util qw( reftype); 7 8our $VERSION = '1.20'; 9 10require Exporter; 11our @ISA = qw(Exporter); 12our %EXPORT_TAGS = ( 13 'all' => [ qw( 14 fieldhash 15 fieldhashes 16 idhash 17 idhashes 18 id 19 id_2obj 20 register 21 )], 22); 23our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); 24 25{ 26 require XSLoader; 27 my %ob_reg; # private object registry 28 sub _ob_reg { \ %ob_reg } 29 XSLoader::load(); 30} 31 32sub fieldhash (\%) { 33 for ( shift ) { 34 return unless ref() && reftype( $_) eq 'HASH'; 35 return $_ if Hash::Util::FieldHash::_fieldhash( $_, 0); 36 return $_ if Hash::Util::FieldHash::_fieldhash( $_, 2) == 2; 37 return; 38 } 39} 40 41sub idhash (\%) { 42 for ( shift ) { 43 return unless ref() && reftype( $_) eq 'HASH'; 44 return $_ if Hash::Util::FieldHash::_fieldhash( $_, 0); 45 return $_ if Hash::Util::FieldHash::_fieldhash( $_, 1) == 1; 46 return; 47 } 48} 49 50sub fieldhashes { map &fieldhash( $_), @_ } 51sub idhashes { map &idhash( $_), @_ } 52 531; 54__END__ 55 56=head1 NAME 57 58Hash::Util::FieldHash - Support for Inside-Out Classes 59 60=head1 SYNOPSIS 61 62 ### Create fieldhashes 63 use Hash::Util qw(fieldhash fieldhashes); 64 65 # Create a single field hash 66 fieldhash my %foo; 67 68 # Create three at once... 69 fieldhashes \ my(%foo, %bar, %baz); 70 # ...or any number 71 fieldhashes @hashrefs; 72 73 ### Create an idhash and register it for garbage collection 74 use Hash::Util::FieldHash qw(idhash register); 75 idhash my %name; 76 my $object = \ do { my $o }; 77 # register the idhash for garbage collection with $object 78 register($object, \ %name); 79 # the following entry will be deleted when $object goes out of scope 80 $name{$object} = 'John Doe'; 81 82 ### Register an ordinary hash for garbage collection 83 use Hash::Util::FieldHash qw(id register); 84 my %name; 85 my $object = \ do { my $o }; 86 # register the hash %name for garbage collection of $object's id 87 register $object, \ %name; 88 # the following entry will be deleted when $object goes out of scope 89 $name{id $object} = 'John Doe'; 90 91=head1 FUNCTIONS 92 93C<Hash::Util::FieldHash> offers a number of functions in support of 94L<The Inside-out Technique> of class construction. 95 96=over 97 98=item id 99 100 id($obj) 101 102Returns the reference address of a reference $obj. If $obj is 103not a reference, returns $obj. 104 105This function is a stand-in replacement for 106L<Scalar::Util::refaddr|Scalar::Util/refaddr>, 107that is, it returns 108the reference address of its argument as a numeric value. The only 109difference is that C<refaddr()> returns C<undef> when given a 110non-reference while C<id()> returns its argument unchanged. 111 112C<id()> also uses a caching technique that makes it faster when 113the id of an object is requested often, but slower if it is needed 114only once or twice. 115 116=item id_2obj 117 118 $obj = id_2obj($id) 119 120If C<$id> is the id of a registered object (see L</register>), returns 121the object, otherwise an undefined value. For registered objects this 122is the inverse function of C<id()>. 123 124=item register 125 126 register($obj) 127 register($obj, @hashrefs) 128 129In the first form, registers an object to work with for the function 130C<id_2obj()>. In the second form, it additionally marks the given 131hashrefs down for garbage collection. This means that when the object 132goes out of scope, any entries in the given hashes under the key of 133C<id($obj)> will be deleted from the hashes. 134 135It is a fatal error to register a non-reference $obj. Any non-hashrefs 136among the following arguments are silently ignored. 137 138It is I<not> an error to register the same object multiple times with 139varying sets of hashrefs. Any hashrefs that are not registered yet 140will be added, others ignored. 141 142Registry also implies thread support. When a new thread is created, 143all references are replaced with new ones, including all objects. 144If a hash uses the reference address of an object as a key, that 145connection would be broken. With a registered object, its id will 146be updated in all hashes registered with it. 147 148=item idhash 149 150 idhash my %hash 151 152Makes an idhash from the argument, which must be a hash. 153 154An I<idhash> works like a normal hash, except that it stringifies a 155I<reference used as a key> differently. A reference is stringified 156as if the C<id()> function had been invoked on it, that is, its 157reference address in decimal is used as the key. 158 159=item idhashes 160 161 idhashes \ my(%hash, %gnash, %trash) 162 idhashes \ @hashrefs 163 164Creates many idhashes from its hashref arguments. Returns those 165arguments that could be converted or their number in scalar context. 166 167=item fieldhash 168 169 fieldhash %hash; 170 171Creates a single fieldhash. The argument must be a hash. Returns 172a reference to the given hash if successful, otherwise nothing. 173 174A I<fieldhash> is, in short, an idhash with auto-registry. When an 175object (or, indeed, any reference) is used as a fieldhash key, the 176fieldhash is automatically registered for garbage collection with 177the object, as if C<register $obj, \ %fieldhash> had been called. 178 179=item fieldhashes 180 181 fieldhashes @hashrefs; 182 183Creates any number of field hashes. Arguments must be hash references. 184Returns the converted hashrefs in list context, their number in scalar 185context. 186 187=back 188 189=head1 DESCRIPTION 190 191A word on terminology: I shall use the term I<field> for a scalar 192piece of data that a class associates with an object. Other terms that 193have been used for this concept are "object variable", "(object) property", 194"(object) attribute" and more. Especially "attribute" has some currency 195among Perl programmer, but that clashes with the C<attributes> pragma. The 196term "field" also has some currency in this sense and doesn't seem 197to conflict with other Perl terminology. 198 199In Perl, an object is a blessed reference. The standard way of associating 200data with an object is to store the data inside the object's body, that is, 201the piece of data pointed to by the reference. 202 203In consequence, if two or more classes want to access an object they 204I<must> agree on the type of reference and also on the organization of 205data within the object body. Failure to agree on the type results in 206immediate death when the wrong method tries to access an object. Failure 207to agree on data organization may lead to one class trampling over the 208data of another. 209 210This object model leads to a tight coupling between subclasses. 211If one class wants to inherit from another (and both classes access 212object data), the classes must agree about implementation details. 213Inheritance can only be used among classes that are maintained together, 214in a single source or not. 215 216In particular, it is not possible to write general-purpose classes 217in this technique, classes that can advertise themselves as "Put me 218on your @ISA list and use my methods". If the other class has different 219ideas about how the object body is used, there is trouble. 220 221For reference C<Name_hash> in L</Example 1> shows the standard implementation of 222a simple class C<Name> in the well-known hash based way. It also demonstrates 223the predictable failure to construct a common subclass C<NamedFile> 224of C<Name> and the class C<IO::File> (whose objects I<must> be globrefs). 225 226Thus, techniques are of interest that store object data I<not> in 227the object body but some other place. 228 229=head2 The Inside-out Technique 230 231With I<inside-out> classes, each class declares a (typically lexical) 232hash for each field it wants to use. The reference address of an 233object is used as the hash key. By definition, the reference address 234is unique to each object so this guarantees a place for each field that 235is private to the class and unique to each object. See C<Name_id> 236in L</Example 1> for a simple example. 237 238In comparison to the standard implementation where the object is a 239hash and the fields correspond to hash keys, here the fields correspond 240to hashes, and the object determines the hash key. Thus the hashes 241appear to be turned I<inside out>. 242 243The body of an object is never examined by an inside-out class, only 244its reference address is used. This allows for the body of an actual 245object to be I<anything at all> while the object methods of the class 246still work as designed. This is a key feature of inside-out classes. 247 248=head2 Problems of Inside-out 249 250Inside-out classes give us freedom of inheritance, but as usual there 251is a price. 252 253Most obviously, there is the necessity of retrieving the reference 254address of an object for each data access. It's a minor inconvenience, 255but it does clutter the code. 256 257More important (and less obvious) is the necessity of garbage 258collection. When a normal object dies, anything stored in the 259object body is garbage-collected by perl. With inside-out objects, 260Perl knows nothing about the data stored in field hashes by a class, 261but these must be deleted when the object goes out of scope. Thus 262the class must provide a C<DESTROY> method to take care of that. 263 264In the presence of multiple classes it can be non-trivial 265to make sure that every relevant destructor is called for 266every object. Perl calls the first one it finds on the 267inheritance tree (if any) and that's it. 268 269A related issue is thread-safety. When a new thread is created, 270the Perl interpreter is cloned, which implies that all reference 271addresses in use will be replaced with new ones. Thus, if a class 272tries to access a field of a cloned object its (cloned) data will 273still be stored under the now invalid reference address of the 274original in the parent thread. A general C<CLONE> method must 275be provided to re-establish the association. 276 277=head2 Solutions 278 279C<Hash::Util::FieldHash> addresses these issues on several 280levels. 281 282The C<id()> function is provided in addition to the 283existing C<Scalar::Util::refaddr()>. Besides its short name 284it can be a little faster under some circumstances (and a 285bit slower under others). Benchmark if it matters. The 286working of C<id()> also allows the use of the class name 287as a I<generic object> as described L<further down|/"The Generic Object">. 288 289The C<id()> function is incorporated in I<id hashes> in the sense 290that it is called automatically on every key that is used with 291the hash. No explicit call is necessary. 292 293The problems of garbage collection and thread safety are both 294addressed by the function C<register()>. It registers an object 295together with any number of hashes. Registry means that when the 296object dies, an entry in any of the hashes under the reference 297address of this object will be deleted. This guarantees garbage 298collection in these hashes. It also means that on thread 299cloning the object's entries in registered hashes will be 300replaced with updated entries whose key is the cloned object's 301reference address. Thus the object-data association becomes 302thread-safe. 303 304Object registry is best done when the object is initialized 305for use with a class. That way, garbage collection and thread 306safety are established for every object and every field that is 307initialized. 308 309Finally, I<field hashes> incorporate all these functions in one 310package. Besides automatically calling the C<id()> function 311on every object used as a key, the object is registered with 312the field hash on first use. Classes based on field hashes 313are fully garbage-collected and thread safe without further 314measures. 315 316=head2 More Problems 317 318Another problem that occurs with inside-out classes is serialization. 319Since the object data is not in its usual place, standard routines 320like C<Storable::freeze()>, C<Storable::thaw()> and 321C<Data::Dumper::Dumper()> can't deal with it on their own. Both 322C<Data::Dumper> and C<Storable> provide the necessary hooks to 323make things work, but the functions or methods used by the hooks 324must be provided by each inside-out class. 325 326A general solution to the serialization problem would require another 327level of registry, one that associates I<classes> and fields. 328So far, the functions of C<Hash::Util::FieldHash> are unaware of 329any classes, which I consider a feature. Therefore C<Hash::Util::FieldHash> 330doesn't address the serialization problems. 331 332=head2 The Generic Object 333 334Classes based on the C<id()> function (and hence classes based on 335C<idhash()> and C<fieldhash()>) show a peculiar behavior in that 336the class name can be used like an object. Specifically, methods 337that set or read data associated with an object continue to work as 338class methods, just as if the class name were an object, distinct from 339all other objects, with its own data. This object may be called 340the I<generic object> of the class. 341 342This works because field hashes respond to keys that are not references 343like a normal hash would and use the string offered as the hash key. 344Thus, if a method is called as a class method, the field hash is presented 345with the class name instead of an object and blithely uses it as a key. 346Since the keys of real objects are decimal numbers, there is no 347conflict and the slot in the field hash can be used like any other. 348The C<id()> function behaves correspondingly with respect to non-reference 349arguments. 350 351Two possible uses (besides ignoring the property) come to mind. 352A singleton class could be implemented this using the generic object. 353If necessary, an C<init()> method could die or ignore calls with 354actual objects (references), so only the generic object will ever exist. 355 356Another use of the generic object would be as a template. It is 357a convenient place to store class-specific defaults for various 358fields to be used in actual object initialization. 359 360Usually, the feature can be entirely ignored. Calling I<object 361methods> as I<class methods> normally leads to an error and isn't used 362routinely anywhere. It may be a problem that this error isn't 363indicated by a class with a generic object. 364 365=head2 How to use Field Hashes 366 367Traditionally, the definition of an inside-out class contains a bare 368block inside which a number of lexical hashes are declared and the 369basic accessor methods defined, usually through C<Scalar::Util::refaddr>. 370Further methods may be defined outside this block. There has to be 371a DESTROY method and, for thread support, a CLONE method. 372 373When field hashes are used, the basic structure remains the same. 374Each lexical hash will be made a field hash. The call to C<refaddr> 375can be omitted from the accessor methods. DESTROY and CLONE methods 376are not necessary. 377 378If you have an existing inside-out class, simply making all hashes 379field hashes with no other change should make no difference. Through 380the calls to C<refaddr> or equivalent, the field hashes never get to 381see a reference and work like normal hashes. Your DESTROY (and 382CLONE) methods are still needed. 383 384To make the field hashes kick in, it is easiest to redefine C<refaddr> 385as 386 387 sub refaddr { shift } 388 389instead of importing it from C<Scalar::Util>. It should now be possible 390to disable DESTROY and CLONE. Note that while it isn't disabled, 391DESTROY will be called before the garbage collection of field hashes, 392so it will be invoked with a functional object and will continue to 393function. 394 395It is not desirable to import the functions C<fieldhash> and/or 396C<fieldhashes> into every class that is going to use them. They 397are only used once to set up the class. When the class is up and running, 398these functions serve no more purpose. 399 400If there are only a few field hashes to declare, it is simplest to 401 402 use Hash::Util::FieldHash; 403 404early and call the functions qualified: 405 406 Hash::Util::FieldHash::fieldhash my %foo; 407 408Otherwise, import the functions into a convenient package like 409C<HUF> or, more general, C<Aux> 410 411 { 412 package Aux; 413 use Hash::Util::FieldHash ':all'; 414 } 415 416and call 417 418 Aux::fieldhash my %foo; 419 420as needed. 421 422=head2 Garbage-Collected Hashes 423 424Garbage collection in a field hash means that entries will "spontaneously" 425disappear when the object that created them disappears. That must be 426borne in mind, especially when looping over a field hash. If anything 427you do inside the loop could cause an object to go out of scope, a 428random key may be deleted from the hash you are looping over. That 429can throw the loop iterator, so it's best to cache a consistent snapshot 430of the keys and/or values and loop over that. You will still have to 431check that a cached entry still exists when you get to it. 432 433Garbage collection can be confusing when keys are created in a field hash 434from normal scalars as well as references. Once a reference is I<used> with 435a field hash, the entry will be collected, even if it was later overwritten 436with a plain scalar key (every positive integer is a candidate). This 437is true even if the original entry was deleted in the meantime. In fact, 438deletion from a field hash, and also a test for existence constitute 439I<use> in this sense and create a liability to delete the entry when 440the reference goes out of scope. If you happen to create an entry 441with an identical key from a string or integer, that will be collected 442instead. Thus, mixed use of references and plain scalars as field hash 443keys is not entirely supported. 444 445=head1 EXAMPLES 446 447The examples show a very simple class that implements a I<name>, consisting 448of a first and last name (no middle initial). The name class has four 449methods: 450 451=over 452 453=item * C<init()> 454 455An object method that initializes the first and last name to its 456two arguments. If called as a class method, C<init()> creates an 457object in the given class and initializes that. 458 459=item * C<first()> 460 461Retrieve the first name 462 463=item * C<last()> 464 465Retrieve the last name 466 467=item * C<name()> 468 469Retrieve the full name, the first and last name joined by a blank. 470 471=back 472 473The examples show this class implemented with different levels of 474support by C<Hash::Util::FieldHash>. All supported combinations 475are shown. The difference between implementations is often quite 476small. The implementations are: 477 478=over 479 480=item * C<Name_hash> 481 482A conventional (not inside-out) implementation where an object is 483a hash that stores the field values, without support by 484C<Hash::Util::FieldHash>. This implementation doesn't allow 485arbitrary inheritance. 486 487=item * C<Name_id> 488 489Inside-out implementation based on the C<id()> function. It needs 490a C<DESTROY> method. For thread support a C<CLONE> method (not shown) 491would also be needed. Instead of C<Hash::Util::FieldHash::id()> the 492function C<Scalar::Util::refaddr> could be used with very little 493functional difference. This is the basic pattern of an inside-out 494class. 495 496=item * C<Name_idhash> 497 498Idhash-based inside-out implementation. Like C<Name_id> it needs 499a C<DESTROY> method and would need C<CLONE> for thread support. 500 501=item * C<Name_id_reg> 502 503Inside-out implementation based on the C<id()> function with explicit 504object registry. No destructor is needed and objects are thread safe. 505 506=item * C<Name_idhash_reg> 507 508Idhash-based inside-out implementation with explicit object registry. 509No destructor is needed and objects are thread safe. 510 511=item * C<Name_fieldhash> 512 513FieldHash-based inside-out implementation. Object registry happens 514automatically. No destructor is needed and objects are thread safe. 515 516=back 517 518These examples are realized in the code below, which could be copied 519to a file F<Example.pm>. 520 521=head2 Example 1 522 523 use strict; use warnings; 524 525 { 526 package Name_hash; # standard implementation: the 527 # object is a hash 528 sub init { 529 my $obj = shift; 530 my ($first, $last) = @_; 531 # create an object if called as class method 532 $obj = bless {}, $obj unless ref $obj; 533 $obj->{ first} = $first; 534 $obj->{ last} = $last; 535 $obj; 536 } 537 538 sub first { shift()->{ first} } 539 sub last { shift()->{ last} } 540 541 sub name { 542 my $n = shift; 543 join ' ' => $n->first, $n->last; 544 } 545 546 } 547 548 { 549 package Name_id; 550 use Hash::Util::FieldHash qw(id); 551 552 my (%first, %last); 553 554 sub init { 555 my $obj = shift; 556 my ($first, $last) = @_; 557 # create an object if called as class method 558 $obj = bless \ my $o, $obj unless ref $obj; 559 $first{ id $obj} = $first; 560 $last{ id $obj} = $last; 561 $obj; 562 } 563 564 sub first { $first{ id shift()} } 565 sub last { $last{ id shift()} } 566 567 sub name { 568 my $n = shift; 569 join ' ' => $n->first, $n->last; 570 } 571 572 sub DESTROY { 573 my $id = id shift; 574 delete $first{ $id}; 575 delete $last{ $id}; 576 } 577 578 } 579 580 { 581 package Name_idhash; 582 use Hash::Util::FieldHash; 583 584 Hash::Util::FieldHash::idhashes( \ my (%first, %last) ); 585 586 sub init { 587 my $obj = shift; 588 my ($first, $last) = @_; 589 # create an object if called as class method 590 $obj = bless \ my $o, $obj unless ref $obj; 591 $first{ $obj} = $first; 592 $last{ $obj} = $last; 593 $obj; 594 } 595 596 sub first { $first{ shift()} } 597 sub last { $last{ shift()} } 598 599 sub name { 600 my $n = shift; 601 join ' ' => $n->first, $n->last; 602 } 603 604 sub DESTROY { 605 my $n = shift; 606 delete $first{ $n}; 607 delete $last{ $n}; 608 } 609 610 } 611 612 { 613 package Name_id_reg; 614 use Hash::Util::FieldHash qw(id register); 615 616 my (%first, %last); 617 618 sub init { 619 my $obj = shift; 620 my ($first, $last) = @_; 621 # create an object if called as class method 622 $obj = bless \ my $o, $obj unless ref $obj; 623 register( $obj, \ (%first, %last) ); 624 $first{ id $obj} = $first; 625 $last{ id $obj} = $last; 626 $obj; 627 } 628 629 sub first { $first{ id shift()} } 630 sub last { $last{ id shift()} } 631 632 sub name { 633 my $n = shift; 634 join ' ' => $n->first, $n->last; 635 } 636 } 637 638 { 639 package Name_idhash_reg; 640 use Hash::Util::FieldHash qw(register); 641 642 Hash::Util::FieldHash::idhashes \ my (%first, %last); 643 644 sub init { 645 my $obj = shift; 646 my ($first, $last) = @_; 647 # create an object if called as class method 648 $obj = bless \ my $o, $obj unless ref $obj; 649 register( $obj, \ (%first, %last) ); 650 $first{ $obj} = $first; 651 $last{ $obj} = $last; 652 $obj; 653 } 654 655 sub first { $first{ shift()} } 656 sub last { $last{ shift()} } 657 658 sub name { 659 my $n = shift; 660 join ' ' => $n->first, $n->last; 661 } 662 } 663 664 { 665 package Name_fieldhash; 666 use Hash::Util::FieldHash; 667 668 Hash::Util::FieldHash::fieldhashes \ my (%first, %last); 669 670 sub init { 671 my $obj = shift; 672 my ($first, $last) = @_; 673 # create an object if called as class method 674 $obj = bless \ my $o, $obj unless ref $obj; 675 $first{ $obj} = $first; 676 $last{ $obj} = $last; 677 $obj; 678 } 679 680 sub first { $first{ shift()} } 681 sub last { $last{ shift()} } 682 683 sub name { 684 my $n = shift; 685 join ' ' => $n->first, $n->last; 686 } 687 } 688 689 1; 690 691To exercise the various implementations the script L<below|/"Example 2"> can 692be used. 693 694It sets up a class C<Name> that is a mirror of one of the implementation 695classes C<Name_hash>, C<Name_id>, ..., C<Name_fieldhash>. That determines 696which implementation is run. 697 698The script first verifies the function of the C<Name> class. 699 700In the second step, the free inheritability of the implementation 701(or lack thereof) is demonstrated. For this purpose it constructs 702a class called C<NamedFile> which is a common subclass of C<Name> and 703the standard class C<IO::File>. This puts inheritability to the test 704because objects of C<IO::File> I<must> be globrefs. Objects of C<NamedFile> 705should behave like a file opened for reading and also support the C<name()> 706method. This class juncture works with exception of the C<Name_hash> 707implementation, where object initialization fails because of the 708incompatibility of object bodies. 709 710=head2 Example 2 711 712 use strict; use warnings; $| = 1; 713 714 use Example; 715 716 { 717 package Name; 718 use parent 'Name_id'; # define here which implementation to run 719 } 720 721 722 # Verify that the base package works 723 my $n = Name->init(qw(Albert Einstein)); 724 print $n->name, "\n"; 725 print "\n"; 726 727 # Create a named file handle (See definition below) 728 my $nf = NamedFile->init(qw(/tmp/x Filomena File)); 729 # use as a file handle... 730 for ( 1 .. 3 ) { 731 my $l = <$nf>; 732 print "line $_: $l"; 733 } 734 # ...and as a Name object 735 print "...brought to you by ", $nf->name, "\n"; 736 exit; 737 738 739 # Definition of NamedFile 740 package NamedFile; 741 use parent 'Name'; 742 use parent 'IO::File'; 743 744 sub init { 745 my $obj = shift; 746 my ($file, $first, $last) = @_; 747 $obj = $obj->IO::File::new() unless ref $obj; 748 $obj->open($file) or die "Can't read '$file': $!"; 749 $obj->Name::init($first, $last); 750 } 751 __END__ 752 753 754=head1 GUTS 755 756To make C<Hash::Util::FieldHash> work, there were two changes to 757F<perl> itself. C<PERL_MAGIC_uvar> was made available for hashes, 758and weak references now call uvar C<get> magic after a weakref has been 759cleared. The first feature is used to make field hashes intercept 760their keys upon access. The second one triggers garbage collection. 761 762=head2 The C<PERL_MAGIC_uvar> interface for hashes 763 764C<PERL_MAGIC_uvar> I<get> magic is called from C<hv_fetch_common> and 765C<hv_delete_common> through the function C<hv_magic_uvar_xkey>, which 766defines the interface. The call happens for hashes with "uvar" magic 767if the C<ufuncs> structure has equal values in the C<uf_val> and C<uf_set> 768fields. Hashes are unaffected if (and as long as) these fields 769hold different values. 770 771Upon the call, the C<mg_obj> field will hold the hash key to be accessed. 772Upon return, the C<SV*> value in C<mg_obj> will be used in place of the 773original key in the hash access. The integer index value in the first 774parameter will be the C<action> value from C<hv_fetch_common>, or -1 775if the call is from C<hv_delete_common>. 776 777This is a template for a function suitable for the C<uf_val> field in 778a C<ufuncs> structure for this call. The C<uf_set> and C<uf_index> 779fields are irrelevant. 780 781 IV watch_key(pTHX_ IV action, SV* field) { 782 MAGIC* mg = mg_find(field, PERL_MAGIC_uvar); 783 SV* keysv = mg->mg_obj; 784 /* Do whatever you need to. If you decide to 785 supply a different key newkey, return it like this 786 */ 787 sv_2mortal(newkey); 788 mg->mg_obj = newkey; 789 return 0; 790 } 791 792=head2 Weakrefs call uvar magic 793 794When a weak reference is stored in an C<SV> that has "uvar" magic, C<set> 795magic is called after the reference has gone stale. This hook can be 796used to trigger further garbage-collection activities associated with 797the referenced object. 798 799=head2 How field hashes work 800 801The three features of key hashes, I<key replacement>, I<thread support>, 802and I<garbage collection> are supported by a data structure called 803the I<object registry>. This is a private hash where every object 804is stored. An "object" in this sense is any reference (blessed or 805unblessed) that has been used as a field hash key. 806 807The object registry keeps track of references that have been used as 808field hash keys. The keys are generated from the reference address 809like in a field hash (though the registry isn't a field hash). Each 810value is a weak copy of the original reference, stored in an C<SV> that 811is itself magical (C<PERL_MAGIC_uvar> again). The magical structure 812holds a list (another hash, really) of field hashes that the reference 813has been used with. When the weakref becomes stale, the magic is 814activated and uses the list to delete the reference from all field 815hashes it has been used with. After that, the entry is removed from 816the object registry itself. Implicitly, that frees the magic structure 817and the storage it has been using. 818 819Whenever a reference is used as a field hash key, the object registry 820is checked and a new entry is made if necessary. The field hash is 821then added to the list of fields this reference has used. 822 823The object registry is also used to repair a field hash after thread 824cloning. Here, the entire object registry is processed. For every 825reference found there, the field hashes it has used are visited and 826the entry is updated. 827 828=head2 Internal function Hash::Util::FieldHash::_fieldhash 829 830 # test if %hash is a field hash 831 my $result = _fieldhash \ %hash, 0; 832 833 # make %hash a field hash 834 my $result = _fieldhash \ %hash, 1; 835 836C<_fieldhash> is the internal function used to create field hashes. 837It takes two arguments, a hashref and a mode. If the mode is boolean 838false, the hash is not changed but tested if it is a field hash. If 839the hash isn't a field hash the return value is boolean false. If it 840is, the return value indicates the mode of field hash. When called with 841a boolean true mode, it turns the given hash into a field hash of this 842mode, returning the mode of the created field hash. C<_fieldhash> 843does not erase the given hash. 844 845Currently there is only one type of field hash, and only the boolean 846value of the mode makes a difference, but that may change. 847 848=head1 AUTHOR 849 850Anno Siegel (ANNO) wrote the xs code and the changes in perl proper 851Jerry Hedden (JDHEDDEN) made it faster 852 853=head1 COPYRIGHT AND LICENSE 854 855Copyright (C) 2006-2007 by (Anno Siegel) 856 857This library is free software; you can redistribute it and/or modify 858it under the same terms as Perl itself, either Perl version 5.8.7 or, 859at your option, any later version of Perl 5 you may have available. 860 861=cut 862