2009-06-29 113 views
12

我需要穆斯的类属性。现在我说:在Moose中创建类属性的最佳方式是什么?

#!/usr/bin/perl 

use 5.010; 
use strict; 
use warnings; 
use MooseX::Declare; 

class User { 
    has id  => (isa => "Str", is => 'ro', builder => '_get_id'); 
    has name => (isa => "Str", is => 'ro'); 
    has balance => (isa => "Num", is => 'rw', default => 0); 

    #FIXME: this should use a database 
    method _get_id { 
     state $id = 0; #I would like this to be a class attribute 
     return $id++; 
    } 
} 

my @users; 
for my $name (qw/alice bob charlie/) { 
    push @users, User->new(name => $name); 
}; 

for my $user (@users) { 
    print $user->name, " has an id of ", $user->id, "\n"; 
} 

回答

8

我发现MooseX :: ClassAttribute,但它看起来很丑。这是最干净的方式吗?

#!/usr/bin/perl 

use 5.010; 
use strict; 
use warnings; 
use MooseX::Declare; 

class User { 
    use MooseX::ClassAttribute; 

    class_has id_pool => (isa => "Int", is => 'rw', default => 0); 

    has id  => (isa => "Str", is => 'ro', builder => '_get_id'); 
    has name => (isa => "Str", is => 'ro'); 
    has balance => (isa => "Num", is => 'rw', default => 0); 

    #FIXME: this should use a database 
    method _get_id { 
     return __PACKAGE__->id_pool(__PACKAGE__->id_pool+1); 
    } 
} 

my @users; 
for my $name (qw/alice bob charlie/) { 
    push @users, User->new(name => $name); 
}; 

for my $user (@users) { 
    print $user->name, " has an id of ", $user->id, "\n"; 
} 
+0

这是正确的方法。你也可以创建一个类类(如果你喜欢它们在一个单独的包中),看看ClassAttribute在底层做什么 – castaway 2009-07-08 07:09:47

+0

不是`use strict`和`use warnings`冗余于`use MooseX :: Declare` ? – 2009-12-09 23:41:36

2

老实说,我不认为这是所有麻烦的类属性的必要。对于只读类的属性,我只是使用一个返回常量的子。对于读写属性,在包一个简单的状态变量,通常的伎俩(我还没有碰到地方,我需要一些更复杂的任何方案。)

state $count = 0; 
method _get_id { 
    return ++$count; 
} 

用词汇专用​​块可如果您需要5.10之前的兼容性,请使用此选项

相关问题