-
-
07 Mar 2014 18:28:20 UTC
- Distribution: Data-Lock
- Module version: 1.01
- Source (raw)
- Browse (raw)
- Changes
- How to Contribute
- Issues (0)
- Testers (3307 / 103 / 0)
- Kwalitee
Bus factor: 1- 97.12% Coverage
- License: unknown
- Activity
24 month- Tools
- Download (7.03KB)
- MetaCPAN Explorer
- Permissions
- Subscribe to distribution
- Permalinks
- This version
- Latest version
- Dependencies
- Test::More
- and possibly others
- Reverse dependencies
- CPAN Testers List
- Dependency graph
- NAME
- VERSION
- SYNOPSIS
- DESCRIPTION
- ATTRIBUTES
- CAVEAT
- SEE ALSO
- AUTHOR
- BUGS & SUPPORT
- ACKNOWLEDGEMENTS
- COPYRIGHT & LICENSE
NAME
Attribute::Constant - Make read-only variables via attribute
VERSION
$Id: Constant.pm,v 1.1 2013/04/03 14:37:57 dankogai Exp $
SYNOPSIS
use Attribute::Constant; my $sv : Constant( $initial_value ); my @av : Constant( @values ); my %hv : Constant( key => value, key => value, ...);
DESCRIPTION
This module uses Data::Lock to make the variable read-only. Check the document and source of Data::Lock for its mechanism.
ATTRIBUTES
This module adds only one attribute,
Constant
. You give its initial value as shown. Unlike Readonly, parantheses cannot be ommited but it is semantically more elegant and thanks to Data::Lock, it imposes almost no performance penalty.CAVEAT
Multi-line attributes
Multi-line attributes are not allowed in Perl 5.8.x.
my $o : Constant(Foo->new(one=>1,two=>2,three=>3)); # ok my $p : Constant(Bar->new( one =>1, two =>2, three =>3 ) ); # needs Perl 5.10
In which case you can use Data::Lock instead:
dlock(my $p = Bar->new( one => 1, two => 2, three => 3 ) );
After all, this module is a wrapper to Data::Lock;
Constants from Variables
You may be surprised the following code DOES NOT work as you expected:
#!/usr/bin/perl use strict; use warnings; use Attribute::Constant; use Data::Dumper; { package MyClass; sub new { my ( $class, %params ) = @_; return bless \%params, $class; } } my $o = MyClass->new( a => 1, b => 2 ); my $x : Constant($o); print Dumper( $o, $x );
Which outputs:
$VAR1 = bless( { 'a' => 1, 'b' => 2 }, 'MyClass' ); $VAR2 = undef;
Why? Because
$x : Constant($o)
happens before$o = Myclass->new()
.On the other hand, the following works.
my $y : Constant(MyClass->new(a => 1,b => 2)); print Dumper( $o, $y );
Rule of the thumb is do not feed variables to constant because varialbes change after the attribute invocation.
Or simply use
Data::Lock::dlock
.use Data::Lock qw/dlock/; dlock my $z = $o; print Dumper( $o, $y );
SEE ALSO
AUTHOR
Dan Kogai,
<dankogai+cpan at gmail.com>
BUGS & SUPPORT
See Data::Lock.
ACKNOWLEDGEMENTS
COPYRIGHT & LICENSE
Copyright 2008-2013 Dan Kogai, all rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
Module Install Instructions
To install Data::Lock, copy and paste the appropriate command in to your terminal.
cpanm Data::Lock
perl -MCPAN -e shell install Data::Lock
For more information on module installation, please visit the detailed CPAN module installation guide.