bool => sub { 1 },
fallback => 1;
+use Carp qw(confess);
use Eval::Closure;
use Scalar::Util qw(blessed refaddr);
use Sub::Name qw(subname);
use base qw(Class::MOP::Object);
-__PACKAGE__->meta->add_attribute('name' => (reader => 'name'));
+__PACKAGE__->meta->add_attribute('name' => (
+ reader => 'name',
+ Class::MOP::_definition_context(),
+));
__PACKAGE__->meta->add_attribute('parent' => (
reader => 'parent',
predicate => 'has_parent',
+ Class::MOP::_definition_context(),
));
my $null_constraint = sub { 1 };
__PACKAGE__->meta->add_attribute('constraint' => (
reader => 'constraint',
writer => '_set_constraint',
- default => sub { $null_constraint }
+ default => sub { $null_constraint },
+ Class::MOP::_definition_context(),
));
+
__PACKAGE__->meta->add_attribute('message' => (
accessor => 'message',
- predicate => 'has_message'
+ predicate => 'has_message',
+ Class::MOP::_definition_context(),
));
+
__PACKAGE__->meta->add_attribute('_default_message' => (
accessor => '_default_message',
+ Class::MOP::_definition_context(),
));
+
# can't make this a default because it has to close over the type name, and
# cmop attributes don't have lazy
my $_default_message_generator = sub {
};
__PACKAGE__->meta->add_attribute('coercion' => (
accessor => 'coercion',
- predicate => 'has_coercion'
+ predicate => 'has_coercion',
+ Class::MOP::_definition_context(),
));
__PACKAGE__->meta->add_attribute('hand_optimized_type_constraint' => (
init_arg => 'optimized',
accessor => 'hand_optimized_type_constraint',
predicate => 'has_hand_optimized_type_constraint',
+ Class::MOP::_definition_context(),
));
__PACKAGE__->meta->add_attribute('inlined' => (
init_arg => 'inlined',
accessor => 'inlined',
predicate => '_has_inlined_type_constraint',
+ Class::MOP::_definition_context(),
));
__PACKAGE__->meta->add_attribute('inline_environment' => (
init_arg => 'inline_environment',
accessor => '_inline_environment',
default => sub { {} },
+ Class::MOP::_definition_context(),
));
sub parents {
__PACKAGE__->meta->add_attribute('compiled_type_constraint' => (
accessor => '_compiled_type_constraint',
- predicate => '_has_compiled_type_constraint'
+ predicate => '_has_compiled_type_constraint',
+ Class::MOP::_definition_context(),
));
+
__PACKAGE__->meta->add_attribute('package_defined_in' => (
- accessor => '_package_defined_in'
+ accessor => '_package_defined_in',
+ Class::MOP::_definition_context(),
));
sub new {
my %args = ref $first ? %$first : $first ? ($first, @rest) : ();
$args{name} = $args{name} ? "$args{name}" : "__ANON__";
+ if ( exists $args{message}
+ && (!ref($args{message}) || ref($args{message}) ne 'CODE') ) {
+ confess("The 'message' parameter must be a coderef");
+ }
+
my $self = $class->_new(%args);
$self->compile_type_constraint()
unless $self->_has_compiled_type_constraint;
sub get_message {
my ($self, $value) = @_;
- my $msg = $self->message || $self->_default_message;
+ my $msg = $self->has_message
+ ? $self->message
+ : $self->_default_message;
local $_ = $value;
return $msg->($value);
}