Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
Attribute::Constant(3)User Contributed Perl DocumentatioAttribute::Constant(3)

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
       Data::Lock, constant

AUTHOR
       Dan Kogai, "<dankogai+cpan at gmail.com>"

BUGS & SUPPORT
       See Data::Lock.

ACKNOWLEDGEMENTS
       Readonly

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.

perl v5.32.0			  2014-03-07		Attribute::Constant(3)

NAME | VERSION | SYNOPSIS | DESCRIPTION | ATTRIBUTES | CAVEAT | SEE ALSO | AUTHOR | BUGS & SUPPORT | ACKNOWLEDGEMENTS | COPYRIGHT & LICENSE

Want to link to this manual page? Use this URL:
<https://www.freebsd.org/cgi/man.cgi?query=Attribute::Constant&sektion=3&manpath=FreeBSD+12.2-RELEASE+and+Ports>

home | help