Carrot
view release on metacpan or search on metacpan
lib/Carrot/Diversity/Block_Modifiers/Plugin/Package/Attribute_Construction.pm view on Meta::CPAN
Carrot::Meta::Greenhouse::Package_Loader::provide_instance(
my $pkg_patterns = '::Modularity::Package::Patterns');
# =--------------------------------------------------------------------------= #
sub address
# /type implementation
{
return(['package', 'attribute_construction']);
}
sub trigger_modifier
# /type implementation
{
my ($this, $meta_monad, $source_code, $all_blocks) = @ARGUMENTS;
# //attribute_construction
# sample1 (#) means to take it from the constructor argument #
# sample2 ""
# sample3 123
# sample4 PRE_* all caps no :
# sample5 ::Diversity::Block_Modifiers::Monad::Blocks instance
my $ready_made = [
'',
'sub attribute_construction',
'# /type method',
'# /effect "Constructs the attribute(s) of a newly created instance."',
'# //parameters',
'# *',
'# //returns',
'{',
' my $this = $_[THIS];',
# 'print(STDERR join("\n", caller, __PACKAGE__), "\n========\n");',
''];
my $class_names = [];
my $optional_methods = [];
foreach my $mapping (@{$this->[ATR_VALUE]})
{
my $options = [];
while ($mapping =~ s{\h+\+(\w+)}{}saa)
{
push($options, $1);
}
my ($name, $value) = split(qr{\h+}, $mapping, 2);
if ($name eq '+')
{
push($ready_made, "\t\$this->superseded;");
next;
}
$value //= '';
my $atr_name = 'ATR_'.uc($name);
if ($value =~ m{\((\d+)\)}saa)
{
push($ready_made, "\t\$this->[$atr_name] = \$_[$1];");
} elsif ($value =~ m{\A('|")(.*)\g{1}\z}saa)
{
push($ready_made, "\t\$this->[$atr_name] = q{$2};");
} elsif ($value =~ m{\A(\d+)\z}saa)
{
#FIXME: re_number would be better
push($ready_made, "\t\$this->[$atr_name] = $1;");
} elsif ($value =~ m{\A([A-Z]+_[A-Z_]+)\z}saa)
{
#FIXME: check wheter such a constant exists
push($ready_made, "\t\$this->[$atr_name] = $1;");
} elsif ($value =~ m{\A((?:\[=\w+=\])?[\w:]+)\z}saa)
{
$pkg_patterns->resolve_placeholders(
my $pkg_name = $1,
$meta_monad->package_name->value);
my $class_class = $name.'_class';
push ($class_names, [$class_class, $pkg_name]);
push($ready_made, "\t\$this->[$atr_name] = \$$class_class->indirect_constructor;");
} else {
die("Don't know what to do with value '$value' for name '$name'.");
}
foreach my $option (@$options)
{
my $optional_method = '';
if ($option eq 'predicate')
{
if ($value eq 'IS_UNDEFINED')
{
$optional_method =
$this->optional_predicate_has(
"has_$name", $atr_name, '');
} else {
$optional_method =
$this->optional_method(
"is_$name", $atr_name,
'::Personality::Abstract::Boolean');
}
} elsif ($option eq 'method')
{
$optional_method = $this->optional_method(
$name, $atr_name, '*');
} elsif ($option eq 'set')
{
my $type = ($value =~ m{\AIS_(TRUE|FALSE)\z}saa)
? '::Personality::Abstract::Boolean'
: '*';
$optional_method = $this->optional_set(
"set_$name", $atr_name, $type);
} elsif ($option eq 'ondemand')
{
# what a hack
foreach my $line (@$ready_made)
( run in 0.572 second using v1.01-cache-2.11-cpan-acf6aa7dc9e )