Frost

 view release on metacpan or  search on metacpan

lib/Frost/Meta/Class.pm  view on Meta::CPAN

package Frost::Meta::Class;

#	LIBS
#
use Moose::Role;

use Frost::Types;
use Frost::Util;

#	CLASS VARS
#
our $VERSION	= 0.63;
our $AUTHORITY	= 'cpan:ERNESTO';

#	CLASS METHODS
#
sub _construct_instance
{
	die "mutable is VERBOTEN";
}

#	PUBLIC ATTRIBUTES
#
has _readonly_attributes	=> ( is => 'ro', isa => 'HashRef',	lazy_build => 1	);
has _transient_attributes	=> ( is => 'ro', isa => 'HashRef',	lazy_build => 1	);
has _derived_attributes		=> ( is => 'ro', isa => 'HashRef',	lazy_build => 1	);
has _virtual_attributes		=> ( is => 'ro', isa => 'HashRef',	lazy_build => 1	);
has _index_attributes		=> ( is => 'ro', isa => 'HashRef',	lazy_build => 1	);
has _unique_attributes		=> ( is => 'ro', isa => 'HashRef',	lazy_build => 1	);
has _auto_id_attributes		=> ( is => 'ro', isa => 'HashRef',	lazy_build => 1	);
has _auto_inc_attributes	=> ( is => 'ro', isa => 'HashRef',	lazy_build => 1	);

#	CONSTRUCTORS
#
sub _build__readonly_attributes	{ $_[0]->_build_features ( 'readonly'	);	}
sub _build__transient_attributes	{ $_[0]->_build_features ( 'transient'	);	}
sub _build__derived_attributes	{ $_[0]->_build_features ( 'derived'	);	}
sub _build__virtual_attributes	{ $_[0]->_build_features ( 'virtual'	);	}
sub _build__index_attributes		{ $_[0]->_build_features ( 'index'		);	}
sub _build__unique_attributes		{ $_[0]->_build_features ( 'unique'		);	}
sub _build__auto_id_attributes	{ $_[0]->_build_features ( 'auto_id'	);	}
sub _build__auto_inc_attributes	{ $_[0]->_build_features ( 'auto_inc'	);	}

#	DESTRUCTORS
#

#	PUBLIC METHODS
#
sub is_readonly	{ $_[0]->_is_feature ( $_[1], 'readonly'	);	}
sub is_transient	{ $_[0]->_is_feature ( $_[1], 'transient'	);	}
sub is_derived		{ $_[0]->_is_feature ( $_[1], 'derived'	);	}
sub is_virtual		{ $_[0]->_is_feature ( $_[1], 'virtual'	);	}
sub is_index		{ $_[0]->_is_feature ( $_[1], 'index'		);	}
sub is_unique		{ $_[0]->_is_feature ( $_[1], 'unique'		);	}
sub is_auto_id		{ $_[0]->_is_feature ( $_[1], 'auto_id'	);	}
sub is_auto_inc	{ $_[0]->_is_feature ( $_[1], 'auto_inc'	);	}

around add_attribute => sub
{
	my $next	= shift;
	my $self	= shift;

	my $attr	= ( blessed $_[0] && $_[0]->isa ( 'Class::MOP::Attribute' ) ? true : false );

	return $self->$next ( @_ )		if $attr;

	my ( $name, @params )	= @_;

	my %options	= ( ( scalar @params == 1 and ref($params[0]) eq 'HASH' ) ? %{$params[0]} : @params );

	##IS_DEBUG and DEBUG __PACKAGE__, '->add_attribute start', Dump [ $name, \%options ], [qw( name options )];

	my $base_name	= $name;

	$base_name	=~ s/^\+//;

	if ( $base_name !~ /^( id )$/x )
	{
		( exists $options{auto_id}		and $options{auto_id} )		and die "Attribute $base_name can not be auto_id";
		( exists $options{auto_inc}	and $options{auto_inc} )	and die "Attribute $base_name can not be auto_inc";
	}

	if ( $base_name =~ /^( id )$/x )
	{
		( exists $options{transient}	and $options{transient}	)	and die "Attribute $base_name can not be transient";
		( exists $options{derived}		and $options{derived}	)	and die "Attribute $base_name can not be derived";
		( exists $options{virtual}		and $options{virtual}	)	and die "Attribute $base_name can not be virtual";
		( exists $options{index}		and $options{index}		)	and die "Attribute $base_name can not be indexed";

		(
			( exists $options{auto_id}		and $options{auto_id} )



( run in 1.604 second using v1.01-cache-2.11-cpan-39bf76dae61 )