File Coverage

blib/lib/CXC/Astro/Regions/CIAO.pm
Criterion Covered Total %
statement 42 42 100.0
branch n/a
condition 1 3 33.3
subroutine 13 13 100.0
pod 1 1 100.0
total 57 59 96.6


line stmt bran cond sub pod time code
1             package CXC::Astro::Regions::CIAO;
2              
3             # ABSTRACT: CIAO Compatible Regions
4              
5 2     2   402867 use v5.20;
  2         8  
6 2     2   12 use warnings;
  2         7  
  2         165  
7 2     2   945 use experimental 'signatures', 'postderef', 'lexical_subs';
  2         5515  
  2         13  
8              
9             our $VERSION = '0.03';
10              
11 2         26 use CXC::Astro::Regions::CIAO::Types qw(
12             Angle
13             Tuple
14             Length
15             NonEmptyStr
16             Vertex
17             ArrayRef
18             XPosition
19             YPosition
20 2     2   1482 );
  2         129  
21              
22 2     2   11375 use CXC::Astro::Regions::CIAO::Variant;
  2         9  
  2         19  
23              
24             package CXC::Astro::Regions::CIAO::Role::Region {
25 2     2   1267 use Moo::Role;
  2         29936  
  2         11  
26             }
27              
28 2     2   1173 use constant RegionRole => __PACKAGE__ . '::Role::Region';
  2         6  
  2         166  
29              
30 2     2   1095 use namespace::clean;
  2         29248  
  2         15  
31              
32 2     2   1133 use parent 'Exporter::Tiny';
  2         229  
  2         17  
33              
34 25     25   43 my sub pkgpath ( @paths ) {
  25         55  
  25         37  
35 25         65 join q{::}, __PACKAGE__, map { ucfirst( $_ ) } @paths;
  25         194  
36             }
37              
38             my sub args ( @args ) {
39             return @args == 1 ? ( name => $args[0] ) : @args;
40             }
41              
42             my sub ANGLE { { name => 'angle', isa => Angle, args( @_ ) } }
43             my sub ANGLEPAIR { { name => 'angles', isa => Tuple [ Angle, Angle ], args( @_ ) } }
44             my sub LENGTH { { name => 'length', isa => Length, args( @_ ) } }
45             my sub LENGTHPAIR { { name => undef, isa => Tuple [ Length, Length ], args( @_ ) } }
46             my sub STRING { { name => undef, isa => NonEmptyStr, args( @_ ) } }
47             my sub VERTEX { { name => undef, isa => Vertex, args( @_ ) } }
48             my sub VERTICES { { name => 'vertices', isa => ArrayRef [Vertex], args( @_ ) } }
49             my sub XPOS { { name => undef, isa => XPosition, args( @_ ) } }
50             my sub YPOS { { name => undef, isa => YPosition, args( @_ ) } }
51              
52 2     2   1257 use Package::Stash;
  2         29  
  2         1481  
53             our @EXPORT_OK = ( 'mkregion' );
54              
55             # my sub REGION ( $name, $params ) { $Region{$name} = $params }
56             my $stash = Package::Stash->new( __PACKAGE__ );
57              
58             my sub REGION ( $region, %spec ) {
59              
60             $spec{with} //= [RegionRole];
61             my $package = pkgpath( $region );
62              
63             if ( exists $spec{name} && $spec{name} ne $region ) {
64             my $parent = pkgpath( $spec{name} );
65             Moo->import::into( $parent );
66             $spec{extends} = [$parent];
67             }
68              
69             my $variant = Variant( $region, %spec );
70             Package::Stash->new( $variant )->add_symbol( q{@CARP_NOT}, [__PACKAGE__] );
71              
72 14     14   18420 $stash->add_symbol( q{&} . $region, sub { $package->new( @_ ) } );
73             push @EXPORT_OK, $region;
74             }
75              
76              
77              
78              
79              
80              
81              
82              
83              
84              
85              
86             # |-----------|-----------------------------------------------------|
87             # | ANNULUS | (xcenter,ycenter,iradius,oradius) |
88             # |-----------|-----------------------------------------------------|
89             REGION annulus => (
90             name => 'annulus',
91             params => [ VERTEX( 'center' ), LENGTHPAIR( 'radii' ) ],
92             );
93              
94              
95              
96              
97              
98              
99              
100              
101              
102              
103              
104             # |-----------|-----------------------------------------------------|
105             # | BOX | (xcenter,ycenter,width,height) |
106             # | BOX | (xcenter,ycenter,width,height,angle) |
107             # |-----------|-----------------------------------------------------|
108             REGION box => (
109             name => 'box',
110             params => [ VERTEX( 'center' ), LENGTH( 'width' ), LENGTH( 'height' ), ANGLE( required => !!0 ) ],
111             );
112              
113              
114              
115              
116              
117              
118              
119             # |-----------|-----------------------------------------------------|
120             # | CIRcle | (xcenter,ycenter,radius) |
121             # |-----------|-----------------------------------------------------|
122             REGION circle => ( params => [ VERTEX( 'center' ), LENGTH( 'radius' ) ], );
123              
124              
125              
126              
127              
128              
129              
130              
131              
132              
133              
134             # |-----------|-----------------------------------------------------|
135             # | ELLipse | (xcenter,ycenter,xradius,yradius,angle) |
136             # |-----------|-----------------------------------------------------|
137             REGION ellipse =>
138             ( params => [ VERTEX( 'center' ), LENGTHPAIR( 'radii' ), ANGLE( default => 0 ) ], );
139              
140              
141              
142              
143              
144              
145              
146              
147              
148             # |-----------|-----------------------------------------------------|
149             # | FIELD | () |
150             # -------------------------------------------------------------------
151             REGION field => ( params => [], );
152              
153              
154              
155              
156              
157              
158              
159              
160              
161              
162              
163             # |-----------|-----------------------------------------------------|
164             # | PIE | (xcenter,ycenter,iradius,oradius,minangle,maxangle) |
165             # |-----------|-----------------------------------------------------|
166             REGION pie => ( params => [ VERTEX( 'center' ), LENGTHPAIR( 'radii' ), ANGLEPAIR, ], );
167              
168              
169              
170              
171              
172              
173              
174              
175              
176             # |-----------|-----------------------------------------------------|
177             # | POInt | (xcenter,ycenter) |
178             # |-----------|-----------------------------------------------------|
179             REGION point => ( params => [ VERTEX( 'center' ) ], );
180              
181              
182              
183              
184              
185              
186              
187              
188              
189             # |-----------|-----------------------------------------------------|
190             # | POLYgon | (x1,y1,x2,y2,x3,y3,...) |
191             # |-----------|-----------------------------------------------------|
192             REGION polygon => ( params => [VERTICES], );
193              
194              
195              
196              
197              
198              
199              
200              
201              
202              
203             # |-----------|-----------------------------------------------------|
204             # | RECTangle | (xmin,ymin,xmax,ymax) |
205             # |-----------|-----------------------------------------------------|
206             REGION rectangle =>
207             ( params => [ XPOS( 'xmin' ), YPOS( 'ymin' ), XPOS( 'xmax' ), YPOS( 'ymax' ) ], );
208              
209              
210              
211              
212              
213              
214              
215              
216              
217             # |-----------|-----------------------------------------------------|
218             # | REGION | (file) |
219             # |-----------|-----------------------------------------------------|
220             REGION region => ( params => [ STRING( 'file' ) ], );
221              
222              
223              
224              
225              
226              
227              
228              
229              
230              
231              
232             # |-----------|-----------------------------------------------------|
233             # | ROTBOX | (xcenter,ycenter,width,height,angle) |
234             # |-----------|-----------------------------------------------------|
235             REGION rotbox => (
236             name => 'rotbox',
237             params => [ VERTEX( 'center' ), LENGTH( 'width' ), LENGTH( 'height' ), ANGLE ],
238             );
239              
240              
241              
242              
243              
244              
245              
246              
247              
248              
249              
250             # |-----------|-----------------------------------------------------|
251             # | SECTor | (xcenter,ycenter,minangle,maxangle) |
252             # |-----------|-----------------------------------------------------|
253             REGION sector => ( params => [ VERTEX( 'center' ), ANGLEPAIR, ], );
254              
255             # No longer need this; clean it up.
256             undef $stash;
257              
258              
259              
260              
261              
262              
263              
264              
265              
266              
267 1     1 1 374504 sub mkregion ( $shape, @args ) {
  1         4  
  1         4  
  1         2  
268 1         4 my $class = pkgpath( $shape );
269 1   33     25 my $new = $class->can( 'new' ) // croak( "unknown region: $shape" );
270 1         8 $class->$new( @args );
271             }
272              
273             1;
274              
275             #
276             # This file is part of CXC-Astro-Regions
277             #
278             # This software is Copyright (c) 2023 by Smithsonian Astrophysical Observatory.
279             #
280             # This is free software, licensed under:
281             #
282             # The GNU General Public License, Version 3, June 2007
283             #
284              
285             __END__