NAME
Scalar::Footnote - Attach hidden scalars to references
SYNOPSIS
use Scalar::Footnote qw( set_footnote get_footnote remove_footnote );
my $ref = [];
# attach invisible footnote to $ref:
set_footnote( $ref, 'footnote' );
# get it back:
$footnote = get_footnote( $ref );
# remove it:
$footnote = remove_footnote( $ref );
# or you can do things OO-stylee:
$obj->Scalar::Footnote::set_footnote( $a_value );
$note = Scalar::Footnote::get_footnote( $obj );
$note = $obj->Scalar::Footnote::get_footnote;
$note = $obj->Scalar::Footnote::remove_footnote;
DESCRIPTION
Scalar::Footnote
lets you attach a scalar to an object (or any kind of reference, really). This scalar footnote is invisible from Perl for all intents and purposes, so for example, if you try dumping an object that has a footnote attached then you won't see it:
my $ref = [qw( foo bar )];
set_footnote( $ref, { a => 'footnote' } );
print Dumper( $ref );
prints:
$VAR1 = [
'foo',
'bar'
];
If you destroy the $ref and you don't hold a copy of the footnote, it also gets destroyed:
my $ref = {};
set_footnote( $ref, MyFootnote->new );
$ref = undef; # footnote gets destroyed
As with most subs in Perl, set_footnote() makes a copy of the footnote scalar you give it (earlier versions didn't).
What Are Footnotes Attached To?
Footnotes are attached to the referenced value of the $ref you pass in (not the variable $ref
itself). So in the following:
my $ref1;
{
my $ref2 = {};
$ref1 = $ref2;
set_footnote( $ref2, ['a footnote'] );
}
print get_footnote( $ref1 );
The footnote is attached to the anonymous hashref, {}
, not $ref2. That's why you can still access it through $ref1 after $ref2 goes out of scope.
What Can I Attach Footnotes To?
Pretty much any kind of reference -- scalar refs, hash refs, array refs, and code refs have been tested.
What Can I Use As A Footnote?
Pretty much any kind of scalar. Constants, scalar refs, hash refs, array refs, and code refs have been tested.
CAVEATS
Watch out for circular references - Scalar::Util's weaken() is your friend, as is Data::Structure::Util's has_circular_ref() and curcular_off().
FUNCTIONS
- $ref = set_footnote( $ref, $footnote )
-
Attaches $footnote to $ref (which must be a reference), and overwrites any footnotes that were previously attached. Dies if $ref is not a reference, or if there was an error. Returns the $ref on success.
- $footnote = get_footnote( $ref )
-
Gets the footnote attached to $ref (which must be a reference). Dies if $ref is not a reference, or if there was an error. Returns the $footnote, or
undef
if no footnote was attached. - $footnote = remove_footnote( $ref )
-
Removes the footnote attached to $ref (which must be a reference). Dies if $ref is not a reference, or if there was an error. Returns the removed $footnote, or
undef
if no footnote was attached.
AUTHORS
M. Friebe, original concept.
Converted to Pixie by Piers Cawley (changed the magic type, module name, stole the idea).
Converted to Scalar::Footnote by Steve Purkis <spurkis@cpan.org>, updated to store a copy of the footnote.