# Copyright (C) 2010, Sascha Kiefer. package Class::Properties; use strict; use warnings; require Carp; sub new { my $proto = shift; my $class = ref $proto || $proto; return bless exists $_[0] ? exists $_[1] ? {@_} : { %{ $_[0] } } : {}, $class; } sub property { my $class = shift; my ( $idx, $len ) = ( 0, scalar @_ ); while ( $idx < $len ) { my $key = $_[ $idx++ ]; my $val = $idx < $len ? $_[ $idx++ ] : undef; my @names = ref $key eq 'ARRAY' ? @$key : ($key); foreach my $name (@names) { Carp::croak(qq/Property "$name" is invalid./) unless $name =~ /^[a-zA-Z_]\w*$/; no strict 'refs'; *{"${class}::$name"} = sub { my $self = shift; if (@_) { $self->{$name} = @_ == 1 ? $_[0] : [@_]; return $self; } else { $self->{$name} = $val unless exists $self->{$name}; return $self->{$name}; } }; } } } 1;