File tree Expand file tree Collapse file tree 3 files changed +134
-2
lines changed Expand file tree Collapse file tree 3 files changed +134
-2
lines changed Original file line number Diff line number Diff line change 1+ package MetaCPAN::Query ;
2+ use Moose;
3+
4+ use Module::Runtime qw( require_module ) ;
5+ use Module::Pluggable::Object ();
6+ use MooseX::Types::ElasticSearch qw( ES ) ;
7+
8+ has es => (
9+ is => ' ro' ,
10+ required => 1,
11+ isa => ES,
12+ coerce => 1,
13+ );
14+
15+ my @plugins = Module::Pluggable::Object-> new(
16+ search_path => [__PACKAGE__ ],
17+ max_depth => 3,
18+ require => 0,
19+ )-> plugins;
20+
21+ for my $class (@plugins ) {
22+ require_module($class );
23+ my $name = $class -> can(' name' ) && $class -> name
24+ or next ;
25+
26+ my $in = " _in_$name " ;
27+ my $gen = " _gen_$name " ;
28+
29+ has $in => (
30+ is => ' ro' ,
31+ init_arg => $name ,
32+ weak_ref => 1,
33+ );
34+
35+ has $gen => (
36+ is => ' ro' ,
37+ init_arg => undef ,
38+ lazy => 1,
39+ default => sub {
40+ my $self = shift ;
41+ require_module($class );
42+ $class -> new(
43+ es => $self -> es,
44+ query => $self ,
45+ );
46+ },
47+ );
48+
49+ no strict ' refs' ;
50+ *$name = sub { $_ [0]-> $in // $_ [0]-> $gen };
51+ }
52+
53+ 1;
Original file line number Diff line number Diff line change 11package MetaCPAN::Query::Role::Common ;
2-
32use Moose::Role;
43
5- has es => ( is => ' ro' , );
4+ use MooseX::Types::ElasticSearch qw( ES ) ;
5+
6+ has es => (
7+ is => ' ro' ,
8+ required => 1,
9+ isa => ES,
10+ coerce => 1,
11+ );
12+
13+ sub name {
14+ my $self = shift ;
15+ my $class = ref $self || $self ;
16+
17+ $class =~ / ^MetaCPAN::Query::([^:]+)$ /
18+ or return undef ;
19+ return lc $1 ;
20+ }
21+
22+ has _in_query => (
23+ is => ' ro' ,
24+ init_arg => ' query' ,
25+ weak_ref => 1,
26+ );
27+
28+ has _gen_query => (
29+ is => ' ro' ,
30+ lazy => 1,
31+ init_arg => undef ,
32+ default => sub {
33+ my $self = shift ;
34+ my $name = $self -> name;
35+
36+ require MetaCPAN::Query;
37+ MetaCPAN::Query-> new(
38+ es => $self -> es,
39+ ( $name ? ( $name => $self ) : () ),
40+ );
41+ },
42+ );
43+
44+ sub query { $_ [0]-> _in_query // $_ [0]-> _gen_query }
645
7461;
Original file line number Diff line number Diff line change 1+ use strict;
2+ use warnings;
3+
4+ use lib ' t/lib' ;
5+
6+ use MetaCPAN::Query;
7+ use MetaCPAN::Server::Test ();
8+ use Test::More;
9+ use Scalar::Util qw( weaken) ;
10+
11+ my $es = MetaCPAN::Server::Test::model-> es;
12+
13+ {
14+ my $query = MetaCPAN::Query-> new( es => $es );
15+ my $release = $query -> release;
16+
17+ isa_ok $release , ' MetaCPAN::Query::Release' ;
18+ is $release -> query, $query , ' got same parent object' ;
19+
20+ weaken $release ;
21+ weaken $query ;
22+ is $query , undef , ' parent object properly released' ;
23+ is $release , undef , ' release object properly released' ;
24+
25+ }
26+
27+ {
28+ my $release = MetaCPAN::Query::Release-> new( es => $es );
29+ my $query = $release -> query;
30+
31+ isa_ok $query , ' MetaCPAN::Query' ;
32+ is $query -> release, $release , ' got same child object' ;
33+
34+ weaken $release ;
35+ weaken $query ;
36+ is $query , undef , ' parent object properly released' ;
37+ is $release , undef , ' release object properly released' ;
38+ }
39+
40+ done_testing;
You can’t perform that action at this time.
0 commit comments