Ok, I think the 2nd option is better here, rather than have 1 plugin have multiple 'internal' plugins to handle each event, if we let the plugin define its run order tags in an array, it offers the most flexibility.  I'm not sure having case statements in the run methods are nessecary tho, rather I'd prefer the plugin to actually implement methods with the same names as its run order tags e.g.

    # valid options are, [:pre_capture, :post_capture, or whatever else we'd like to introduce]
    def run_options
       [:pre_capture, :post_capture]
    end

    # args we pass here are to be decided
    def pre_capture(*args)
      #.. do plugin stuff
    end

    # args we pass here are to be decided
    def post_capture(*args)
      #.. do plugin stuff
    end

What do you think?