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;
{
sub
new {
my
(
$class
,
%params
) =
@_
;
return
bless
\
%params
,
$class
;
}
}
my
$o
= MyClass->new(
a
=> 1,
b
=> 2 );
my
$x
: Constant(
$o
);
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));
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
.
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.