Elastic-Model
view release on metacpan or search on metacpan
lib/Elastic/Model/TypeMap/Base.pm view on Meta::CPAN
if ($is_lazy) {
$readers{$name} = $attr->get_read_method_ref;
push @src, '$readers{"' . $name . '"}->($self);';
}
else {
push @src, "if ($exists) {";
}
push @src, '$val = ' . $get_raw . ';',
'$hash{"' . $name . '"} = ' . $deflator . ';';
push @src, '}' unless $is_lazy;
}
push @src,
(
'1;} ',
'or die "Error deflating attribute ($attr) in class ".',
'Scalar::Util::blessed($self).',
'":\n ".($@ || "Unknown error");',
'return \%hash',
'}'
);
Eval::Closure::eval_closure(
source => \@src,
environment => {
'%deflators' => \%deflators,
'%readers' => \%readers
}
);
}
#===================================
sub class_inflator {
#===================================
my ( $map, $class, $attrs ) = @_;
$attrs ||= $map->indexable_attrs($class);
my %inflators = map { $_ => $map->find_raw_inflator( $attrs->{$_} ) }
keys %$attrs;
my @src = (
'sub {',
'my ($self,$hash) = @_;',
'my ($attr,$val,$res);',
'eval {'
);
for my $name ( sort keys %inflators ) {
my $attr = $attrs->{$name};
my $inflator = $inflators{$name};
my $set_raw = $attr->_inline_instance_set( '$self', '$res' );
if ( ref $inflator ) {
$inflator = '$inflators{"' . $name . '"}->($val)';
}
push @src,
(
'$attr = "' . $name . '";',
'if (exists $hash->{"' . $name . '"}) {',
'$val = $hash->{"' . $name . '"};',
'$res = ' . $inflator . ';',
$set_raw . ';',
$attr->_inline_weaken_value( '$self', '$res' ),
'}'
);
}
push @src,
(
'1}',
'or die "Error inflating attribute ($attr) in class ".',
'Scalar::Util::blessed($self).',
'":\n ".($@ || "Unknown error");',
'return $self',
'}'
);
Eval::Closure::eval_closure(
source => \@src,
environment => { '%inflators' => \%inflators, }
);
}
our %Allowed_Attrs = (
string => {
'index_name' => 1,
'store' => 1,
'index' => 1,
'term_vector' => 1,
'boost' => 1,
'null_value' => 1,
'analyzer' => 1,
'index_analyzer' => 1,
'search_analyzer' => 1,
'search_quote_analyzer' => 1,
'include_in_all' => 1,
'multi' => 1,
},
integer => {
'index_name' => 1,
'store' => 1,
'index' => 1,
'precision_step' => 1,
'boost' => 1,
'null_value' => 1,
'include_in_all' => 1,
'multi' => 1,
},
date => {
'index_name' => 1,
'format' => 1,
'store' => 1,
'index' => 1,
'precision_step' => 1,
'boost' => 1,
'null_value' => 1,
'include_in_all' => 1,
'multi' => 1,
},
boolean => {
'index_name' => 1,
'store' => 1,
'index' => 1,
'boost' => 1,
( run in 1.879 second using v1.01-cache-2.11-cpan-39bf76dae61 )