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 1
1
package MetaCPAN::Query::Role::Common ;
2
-
3
2
use Moose::Role;
4
3
5
- has es => ( is => ' ro' , );
4
+ use MetaCPAN::Query ();
5
+ use MooseX::Types::ElasticSearch qw( ES ) ;
6
+
7
+ has es => (
8
+ is => ' ro' ,
9
+ required => 1,
10
+ isa => ES,
11
+ coerce => 1,
12
+ );
13
+
14
+ sub name {
15
+ my $self = shift ;
16
+ my $class = ref $self || $self ;
17
+
18
+ $class =~ / ^MetaCPAN::Query::([^:]+)$ /
19
+ or return undef ;
20
+ return lc $1 ;
21
+ }
22
+
23
+ has _in_query => (
24
+ is => ' ro' ,
25
+ init_arg => ' query' ,
26
+ weak_ref => 1,
27
+ );
28
+
29
+ has _gen_query => (
30
+ is => ' ro' ,
31
+ lazy => 1,
32
+ init_arg => undef ,
33
+ default => sub {
34
+ my $self = shift ;
35
+ my $name = $self -> name;
36
+
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 }
6
45
7
46
1;
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