8 print STDERR "Scanning...\n";
14 if(/^CLASS\(([^)]*)\)(?:\s*EXTENDS\(([^)]*)\))?/)
16 $classes{$1} = defined($2) ? $2 : "Object";
17 $classoffile{$f} = $1;
19 if(/^\s*METHOD\(([^),]*),\s*([^),]*)/)
21 $methods{$1}{$2} = $1;
22 $methodnames{"$2$1"} = $f;
24 if(/^\s*ATTRIB(?:ARRAY)?\(([^),]*),\s*([^),]*)/)
32 # propagate down methods etc.
33 print STDERR "Propagating...\n";
34 for my $class(keys %classes)
36 print STDERR "$class";
40 $base = $classes{$base};
41 last if not defined $base;
42 print STDERR " -> $base";
43 while(my ($method, $definingclass) = each %{$methods{$base}})
45 $methods{$class}{$method} = $definingclass
46 if not defined $methods{$class}{$method};
48 while(my ($attr, $definingclass) = each %{$attrs{$base}})
50 $attrs{$class}{$attr} = $definingclass
51 if not defined $attrs{$class}{$attr};
57 # change all calls to base method to super, complain about skipping
58 print STDERR "Fixing...\n";
62 my $s = do { undef local $/; <$fh>; };
66 my $class = $classoffile{$f};
67 my $base = $classes{$class};
68 next if not defined $base;
70 my @methods_super = map { [ $_ . $methods{$base}{$_}, "SUPER($class).$_" ]; } keys %{$methods{$base}};
73 my ($search, $replace) = @$_;
74 my $n = ($s =~ s/\b$search\b/$replace/g);
75 print STDERR "[$f] $search -> $replace... $n replacements\n"
79 for(grep { $methodnames{$_} ne $f } keys %methodnames)
83 print STDERR "[$f] calls non-super external method directly: $_\n";
89 print STDERR "Rewriting $f...\n";