10 my $data < io($fname);
19 sub with_class_or_role_block (&) {
21 $_ =~ s{^(class|role)\s*(.*?)which\s*{(.*?)^};}
23 local *_ = { type => $1, header => $2, body => $3 };
30 $h =~ s/^\s*\S+\s+// || die;
32 while ($h =~ /is\s*([^ ,]+),?/g) {
39 my $base = join(', ', parse_header);
40 ($base ? "extends ${base};\n\n" : '');
43 sub sq { # short for 'strip quotes'
45 $copy =~ s/^'(.*)'$/$1/;
46 $copy =~ s/^"(.*)"$/$1/;
53 s/^\s*implements *(\S+).*?{/"sub ${\sq $1} {"/ge;
55 s/^\s*overrides/override/g;
59 sub top { "use namespace::clean -except => [ qw(meta) ];\n" }
60 sub tail { $_{type} eq 'class' ? "__PACKAGE__->meta->make_immutable;\n" : ""; }
64 with_class_or_role_block {
65 return top.build_extends.filtered_body.tail;