It's for this reason (the need to inject additional input) that it's rarely as simple as setting a button's command/action. I've always gotten around this by composing commands or signal generators or whatever, but actions aren't composable, so this leads to a bit of a problem:

~~~~
// View model
_loginSignalGenerator = [RACDynamicSignalGenerator generatorWithBlock:^(NSString *username) { ... }];

// View controller
RACSignalGenerator *loginButtonSignalGenerator = [[RACDynamicSignalGenerator generatorWithBlock:^(id _) {
  return [self.usernameField.rac_textSignal take:1];
}] postCompose:self.viewModel.loginSignalGenerator];
~~~~

But now, how on earth to we get the action? The `enabledIf` logic should be local to the view-model. Ideally, I would be able to use something like this:

~~~~
// View model
_loginAction = 
  [[RACDynamicSignalGenerator generatorWithBlock:^(NSString *username) { ... }] 
    actionEnabledIf:currentlyOnline];

// View controller
loginButton.rac_action = 
  [[self.usernameField.rac_textSignal take:1].action
   postCompose:self.viewModel.loginAction];
~~~~

So I think actions need to compose too (or, it strikes me—though I hate to bring up design change ideas this late in the game—why is `RACAction` not just another subclass of `RACSignalGenerator`?), unless I'm missing a more elegant way to do this.