File tree Expand file tree Collapse file tree 3 files changed +137
-2
lines changed Expand file tree Collapse file tree 3 files changed +137
-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+ $class -> new(
42+ es => $self -> es,
43+ query => $self ,
44+ );
45+ },
46+ );
47+
48+ no strict ' refs' ;
49+ *$name = sub { $_ [0]-> $in // $_ [0]-> $gen };
50+ }
51+
52+ 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+ or diag explain $query ;
24+ is $release , undef , ' release object properly released'
25+ or diag explain $release ;
26+
27+ }
28+
29+ {
30+ my $release = MetaCPAN::Query::Release-> new( es => $es );
31+ my $query = $release -> query;
32+
33+ isa_ok $query , ' MetaCPAN::Query' ;
34+ is $query -> release, $release , ' got same child object' ;
35+
36+ weaken $release ;
37+ weaken $query ;
38+ is $query , undef , ' parent object properly released'
39+ or diag explain $query ;
40+ is $release , undef , ' release object properly released'
41+ or diag explain $release ;
42+ }
43+
44+ done_testing;
You can’t perform that action at this time.
0 commit comments