Dan Kogai > Data-Lock-1.03 > Attribute::Constant

Download:
Data-Lock-1.03.tar.gz

Dependencies

Annotate this POD

CPAN RT

Open  0
View/Report Bugs
Module Version: 1.01   Source  

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.

syntax highlighting: