This meta-programming relying a custom vocabulary to populate objects makes them really hard to understand and to introspect. In addition, it is quite tricky code and to debug.

May I suggest something less sophisticated: for each of these methods, say 'transform', have a corresponding '_transform' method. Then a property:
<pre>
@property
def _get_transform(self):
   if hasattr(self.steps[-1], 'transform'):
       return self._transform
</pre>
I believe that this should do the trick.