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 )