MooseX::LocalAttribute - local-ize attributes on Moose-ish objects
use MooseX::LocalAttribute; my $freddy = Person->new( name => 'Freddy' ); print $freddy->name; # Freddy { my $temporary_name = 'Mr Orange'; my $guard = local_attribute( $freddy, "name", $temporary_name ); print $freddy->name; # Mr Orange steal_diamonds( $freddy ); } print $freddy->name; # Freddy
This module provides a mechanism to temporarily replace the value of an object attribute with a different variable. In typical object oriented Perl code, an object contains a blessed hash reference, so it's possible to reach into the internals to localise data.
my $local_bar; local $foo->{bar} = \$local_bar;
This has a few problems though. It is generally a better idea to use accessors rather than to rumage around in the internals of an object. This is especially true if one does not know whether the object is in fact a hash reference under the hood.
When a variable is localised with local, a backup of that variable is made. Perl then places a directive on the stack that restores the variable when it is goes out of scope. This module does the same thing for attributes of objects.
local
While this module is called MooseX::LocalAttribute, it will work for all kinds of objects, as long as there is a read/write accessor. It has been tested for Moose, Mouse, Moo, Mo, Mojo::Base, Class::Accessor, Util::H2O, Object::PAD and classic Perl OO code using bless with hand-rolled accessors. There is a good chance it will work on other object implementations too.
bless
Takes an object $obj and temporarily localizes the attribute $attr on it to $val. It returns a Scope::Guard object that will restore the original value of $attr when it goes out of scope.
$obj
$attr
$val
my $guard = local_attribute( $bob, 'name', 'joe' ); # $bob->name eq 'joe'
You must always capture the return value of local_attribute and store it in a variable. It will die if called in void context, because the underlying Scope::Guard object cannot work in void context. Your attribute would be replaced permanently.
local_attribute
local_attribute( $foo, 'attr', 'new value' ); # BOOM
This function is exported by default.
Class::Std - this does not support combined getter/setter methods
Object::Tiny - this creates read-only accessors
Scope::Guard
Moose
Moo
Julien Fiegehenn <simbabque@cpan.org>
Copyright (c) 2022, Julien Fiegehenn.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
To install MooseX::LocalAttribute, copy and paste the appropriate command in to your terminal.
cpanm
cpanm MooseX::LocalAttribute
CPAN shell
perl -MCPAN -e shell install MooseX::LocalAttribute
For more information on module installation, please visit the detailed CPAN module installation guide.